2017-01-02 71 views
-1

對不起,不倫不類的標題步進,也想不出什麼更好的主意。停止從GDB通過glibc的功能

當我通過GDB運行我的程序找到分段錯誤,我得到數千這種垃圾的行

(gdb) step 
_IO_new_file_xsputn (f=0x76fa0b40 <_IO_2_1_stdout_>, data=0x7efff284, n=7) at fileops.c 
1279 fileops.c: No such file or directory. 
(gdb) step 
1273 in fileops.c 
(gdb) step 
1279 in fileops.c 
(gdb) step 
1286 in fileops.c 
(gdb) step 
1288 in fileops.c 
(gdb) step 
1289 in fileops.c 
(gdb) step 
1292 in fileops.c 
(gdb) step 
1294 in fileops.c 
(gdb) step 
1292 in fileops.c 

...和和和。它使調試非常困難和乏味,因爲:

  • 我必須鍵入step(或按回車)反覆。
  • 我幾乎看不到我的程序的輸出,因爲它隱藏在毫無意義的信息中。
  • 如果我按重複輸入,我經常想念我在尋找賽格故障。

我怎麼能告訴GDB退出打印這樣的線?

1273  in fileops.c 

有沒有我可以使用一些配置文件或命令行選項?

+1

你確定需要瀏覽'fileops.c'中的glibc代碼嗎?你可以'完成'去掉'_IO_new_file_xsputn'函數並繼續調試你的代碼。 – ks1322

+0

@ ks1322我認爲這是我正在尋找的;我會盡快嘗試。你可以把它放在答案中? –

+1

相關:[防止GDB進入函數(或文件)](http://stackoverflow.com/questions/1133365/preventing-gdb-from-stepping-into-a-function-or-file)。參見'skip'命令。 –

回答

2

您確定您需要瀏覽fileops.c中的glibc代碼嗎?

如果你只想調試你自己的代碼,你應該在函數中走出_IO_new_file_xsputn函數,並且繼續調試你的代碼。

1

這就是step如何工作 - 它步驟 s通過代碼。

約斷點

什麼?如果你設置了一個,那麼調試器就會在那裏停下來,讓你手動完成代碼。

對於像分割故障或類似的信號,中止執行,您可以runbacktrace當程序已經停止,以獲得關於該位置停止執行的信息。然後在那裏設置斷點,程序將在違規指令處停止。

2

我怎麼能告訴GDB退出打印這樣的線?

通過使用step命令,你要求 GDB打印正是這種信息。

如果你不想要那個信息,你應該停止詢問

我經常想念我在尋找賽格故障。

如果你只是run,當你得到SIGSEGV時,GDB會自動停止,你不能錯過這個。

什麼你可能要的是SIGSEGV前停止代碼中的某個時間,並從那裏一步。有幾種技術可以實現這一點,reverse debugging就是其中之一。使用replay debugging是另一個。

很難提供更多的建議,因爲你沒有顯示你是實際上試圖做的。