1. 程式人生 > >gdb除錯中兩種令人費解的情況解釋

gdb除錯中兩種令人費解的情況解釋

gdb這個除錯工具怎麼使用,在於相關的命令的使用(break、watch、print、continue、next、step等),

gdb如何除錯,需要結合程式的設計,程式碼的邏輯,多實踐總結。

這裡解釋兩個在實踐中遇到的令初學者費解的問題:

1)為啥設定了斷點 b write_pipe,gdb除錯中,在斷點處沒有停下?

      設想下面的情況,一個程序在後臺執行過程中CPU佔有率140%,gdb掛上去檢視是什麼情況。

            gdb program pid(程序的ID)

            通過bt檢視忙碌的執行緒的呼叫棧,發現其一直在忙write_pipe,通過b write_pipe設定斷點,再continue跑起來,

            發現程式沒有在write_pipe處停下。

       這種情況,一般是程式設計師在程式執行後,有修改了程式碼重新進行了編譯,符號的地址與原來發生了錯位,就是說

        斷點設定到另外的程式碼上了。

2)gdb用bt顯示呼叫棧的資訊,顯示??,可能是什麼原因?

      

                       Figure -- 1

    這個現象,在上面除錯coredump檔案時經常會發生,呼叫棧#3 #2 #1對應的地址無法對應具體的函式。
    原因是,1)產生coredump的程式,與當前除錯時的程式,是不同的版本,除錯資訊&符號表都錯位了。
    2)呼叫棧溢位(這個沒有確認過)。3)gdb corefile使用不當,除錯corefile需要程式,gdb program corefile。