2011-02-04 40 views
0

我正在調試一個令人討厭的問題,其中一個文件(不是我寫的任何記錄)會導致程序崩潰。這意味着,我有workingbroken,只有一個C(++)包含語句已更改。我使用的一些庫沒有調試信息。如何使用GDB輸出C +程序集跟蹤?

我想要做的是讓GDB輸出爲程序運行而執行的每一行C++,以及一些不能用於文本文件的x86指令,這種格式可以區分兩個輸出並希望能夠找出什麼出錯。

在GDB中這很容易嗎?

回答

5

您可以檢查每個版本中預處理輸出之間的差異。例如:

gcc -dD -E a.cc -o a.pre 
gcc -dD -E b.cc -o b.pre 
diff -u a.pre b.pre 

您可以嘗試使用不同的「-d」設置以使其更加冗長/簡潔。也許在列表上的差異將是顯而易見的。它通常就像一個根據包含文件改變大小的結構。

如果你真的想要弄亂每條指令或線條痕跡,你可以使用valgrind並查看路徑在哪裏分歧,但我認爲你可能會遇到一個痛苦的世界。事實上,你可能會發現valgrind發現你的bug,然後100你不知道關於:)我期望這個問題只是一個結構或其他數據大小的差異,你不需要打擾。

你可以讓gdb自動化線跟蹤。這將是非常痛苦的。基本上你需要編寫腳本來重複運行「n」(下一行),直到崩潰,然後檢查日誌。如果你可以腳本「B主」,然後「運行」,然後無限的「N」,這將做到這一點。可能有一個內置的命令來做到這一點,但我不知道它。

+0

除了`#if` /`#else`結構等變體外,還可能有一些靜態初始化錯誤。如果存在某種依賴性,`#include`可能會改變其包含的其他內容的順序,從而導致崩潰。或者,`#include`文件可能會添加一個初始化失敗的靜態對象。 `gcc -E`輸出也是開始調查這些問題的好方法。如果失敗的`#include`放在最後(所以其他包含的順序沒有改變),它可能會最小化差異噪聲,然後查看它是否仍然中斷。 – 2011-02-04 05:10:40

0

我不認爲GDB可以做到這一點;雖然個人資料可能會有幫助嗎?你用gcc編譯?看看-p和-pf命令,我認爲這些可能很有用。

0

gdb提示符下的disassemble命令將反彙編您停止的當前函數,但我不認爲輸出整個執行路徑是可行的。

你包括哪些圖書館?如果它是開源的,你可以在啓用調試符號的情況下重新編譯它。另外,如果您使用的是Linux,大多數發行版都有-dbg版本的公用庫。