gdb除錯中兩種令人費解的情況解釋
阿新 • • 發佈:2018-12-21
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。