執行應用程序以“分段錯誤”結束
我有一個命令行應用程序,它在執行時沒有做它應該做的事情,並且在某個時刻留下了消息:
Segmentation fault
這是什麼意思?我該怎麼辦?
分段錯誤是記憶體訪問衝突的結果。該程序引用了分配給它的記憶體地址之外的記憶體地址,並且作業系統核心通過使用 SIGSEGV 終止該程序來響應。
這是一個錯誤,因為嘗試訪問不可訪問的記憶體是沒有意義的(無法做到)。然而,這類錯誤很容易犯,尤其是在諸如 C 和 C++ 之類的語言中(它們佔了很多常見的應用程序)。它表示程序本身或它連結到的庫中的錯誤。如果您希望報告錯誤(這樣做——這有幫助),最好包含導致 seg 錯誤的事件的回溯。
為此,您可以在內部執行程序
gdb
(GNU 調試器),如果尚未安裝它,它應該可以從任何 linux 發行版中獲得(該軟體包將被稱為“gdb”)。如果損壞的應用程序被稱為“brokenapp”:gdb brokenapp
將出現一段關於版權和許可的段落,最後會出現帶有游標的提示:
(gdb) _
鍵入
run
並按 Enter。如果您需要提供參數(例如-x --foo=bar whatever
)附加那些(run -x --foo=bar whatever
)。該程序將執行它所做的事情,您將看到輸出,如果您需要進行互動,您可以(注意您可以在 gdb 中執行任何類型的程序,包括 GUI 程序)。在通常出現段錯誤的地方,您會看到:Program received signal SIGSEGV, Segmentation fault. 0x00000000006031c9 in ?? () (gdb) _
這裡的第二行輸出只是一個例子。現在輸入
bt
(對於“回溯”)並按輸入鍵。您會看到類似這樣的內容,儘管它可能會更長:(gdb) bt #0 0x00000000006031c9 in ?? () #1 0x000000000040157f in mishap::what() const () #2 0x0000000000401377 in main ()
如果它更長,您一次只會得到一個螢幕,並且會有一條
--More--
消息。一直按輸入,直到完成。您現在可以quit
,輸出將保留在您的終端中。將所有內容複製Program received signal SIGSEGV
到文本文件中,並使用應用程序的錯誤跟踪器送出錯誤報告;您可以通過搜尋線上找到這些內容,例如“brokenapp 錯誤報告”——您可能需要註冊才能通過電子郵件向您發送回复。包括您對問題的描述、您提供給 的任何參數run
等,以及回溯的副本(如果它很長,可能有一種方法可以在錯誤跟踪器界面中附加一個文本文件)。還包括版本,如果你知道它是什麼(brokenapp --version
可能有效,或者手冊頁可能指示如何獲取它),希望有人會在不久的將來回复您。送出錯誤通常是值得讚賞的。