1. 程式人生 > >linux下gdb除錯檢視原始碼

linux下gdb除錯檢視原始碼

 GDB是GNU開源組織釋出的一個強大的UNIX下的程式除錯工具。或許,各位比較喜歡那種圖形介面方式的,像VC、BCB等IDE的除錯,但如果你是在UNIX平臺下做軟體,你會發現GDB這個除錯工具有比VC、BCB的圖形化偵錯程式更強大的功能。所謂“寸有所長,尺有所短”就是這個道理。     一般來說,GDB主要幫忙你完成下面四個方面的功能:
●啟動你的程式,可以按照你的自定義的要求隨心所欲的執行程式。
●可讓被除錯的程式在你所指定的調置的斷點處停住。(斷點可以是條件表示式)
●當程式被停住時,可以檢查此時你的程式中所發生的事。
●動態的改變你程式的執行環境。
除錯指令:
gdb+a.out
l :從main函式開始開始
l + 行號
l + 函式名
b + 行號:設斷點
b + 函式名
i b:檢視斷點資訊
r:執行(有斷點則在第一個斷點處停下來)
n:單步向下執行
s:單步執行,且可以進入函式
print +內容:列印內容
whatis +內容:檢視該內容的型別
d +編號:刪除編號處(不是行號)的斷點。
b +行號 if i==9:設定條件斷點
finish:執行到當前函式返回處(退出函式)
bt:列印棧幀關係 首先直接列出問題及其解決方法:設定a.cpp:1234這樣的斷點後(斷點位於.so檔案中),gdb知道停在哪個函式,並能夠停下來,但是無法顯示原始檔名及行號,也無法看到原始碼。明顯是gdb有問題或者是除錯資訊有問題,我試遍了-g , -gstabs , -ggdb , -gstabs+引數,最終,-gstabs+引數可以和我的gdb完美配合,輸出了我想要的東西,能夠在debug的時候正確的看到函式名,行號,並能正確的看到原始碼。這段話是在我解決問題之後新增在原文章之前的。供快速參考。好了,現在來看一個一般性的問題:有時候在用gdb除錯程式的時候,發現gdb找不到原始碼。用list命令無效。記住: gdb的除錯資訊中並不包含原始碼,只是包含了怎樣去尋找原始碼,但是因為某種原因,比如你的原始碼轉移了位置或者別的原因。你需要告訴gdb到哪裡去尋找原始碼。這個通過directory命令來實現。 要檢視當前gdb尋找原始碼的路徑:show directories新增一個新的路徑到查詢路徑:dir  dirname新增多個時,個dirname用: 分開。詳細見 : http://ftp.gnu.org/old-gnu/Manuals/gdb-5.1.1/html_node/gdb_48.html 另外:有時候發現除錯資訊不正確,或者沒有除錯資訊,而gcc在編譯的時候使用的引數為-g ,這時,可以個引數-g 該為-gstabs 就可以了。 我現在碰到的就是這種情況,具體原因還不是很清楚。當利用-gstabs編譯以後,程式在停下來的時候,會顯示函式堆疊,每個棧會顯示原始檔以及行數,但是原始碼還是列不出來,原因是directory還沒有設好 。後來發現-gstabs編譯後,有些原始碼的位置被弄錯了。繼續嘗試-gstabs+ , 最終才看到期望的效果。 需要後續的去了解下這幾個引數之前的區別以及為什麼要這麼用。
---------------------
作者:sunxiaopengsun
來源:CSDN
原文:https://blog.csdn.net/sunxiaopengsun/article/details/79445300
版權宣告:本文為博主原創文章,轉載請附上博文連結!
---------------------
作者:龍躍十二
來源:CSDN
原文:https://blog.csdn.net/qq_38646470/article/details/79901401
版權宣告:本文為博主原創文章,轉載請附上博文連結!