下發給測試部測試的軟體,以及產品發布的軟體都是不帶除錯資訊的release版本;release版本軟體執行速率比debug版本的程式要快,但出了問題由於沒有除錯資訊,不利於問題的分析,特別是在一些售後問題中比較明顯。
smh:~ # ps -elf |grep netlink
4 s root 3698 1 0 80 0 - 6833 - 09:03 ? 00:00:00 /b_iscsi/bn_cli/netlink_daemon
0 s root 18190 30267 0 80 0 - 744 pipe_w 20:32 pts/2 00:00:00 grep netlink
smh:~ # gdb attach 3698 <------------------------ gdb掛接到程序上
gnu gdb 6.6
gdb is free software, covered by the gnu general public license, and you are
welcome to change it and/or distribute copies of it under certain conditions.
type "show copying" to see the conditions.
there is absolutely no warranty for gdb. type "show warranty" for details.
this gdb was configured as "x86_64-suse-linux"...
attach: no such file or directory.
attaching to process 3698
…….loaded symbols for /lib64/ld-linux-x86-64.so.2
failed to read a valid object file image from memory.
0x00007fea92d1fe2b in ?? () from /lib64/libpthread.so.0
(gdb) b bn_disk.c:256 <-------------------------在bn_disk.c設定斷點
no source file named bn_disk.c.
make breakpoint pending on future shared library load? (y or [n]) y
breakpoint 1 (bn_disk.c:256) pending. <-------------------------未能成功設定斷點
(gdb) b main <-------------------------在主函式上設定斷點
breakpoint 2 at 0x40304d <-------------------------斷點設定顯示沒有除錯資訊
如上圖所示,在掛接到netlink的時候存在兩個問題:
(1)、可以在netlink的可執行檔案上設定斷點,但設定了斷點確無法看到相關的除錯資訊。
(2)、無法在netlink呼叫的庫檔案中設定斷點。
如果上面2個問題不解決,則很多gdb的功能就無法使用,不利於除錯。
上面兩個問題是由於release版本程式不帶除錯資訊(也就是編譯**的時候不帶 –g 資訊),因此要解決該問題,需要想辦法把程式的除錯資訊再安裝到程式裡面去。對於cli,比較簡單,直接重新編譯一下,然後放到裝置上,通過attach到程序的方式即可。而對於cli呼叫的庫檔案,則稍微複雜一點,具體操作步驟如下。
1、 重新編譯軟體(包括庫和cli)
(1)、修改inte***ce庫的makefile,將下面一句
cc := gcc -wall –fpic 修改為 cc := gcc -wall –fpic –g
(2)、重新編譯cli和庫。注:這裡當然要使用同乙個版本和**
(3)、將cli和庫拷貝到裝置上。注:cli和庫都不用覆蓋原來的檔案,任意放置乙個目錄即可。比如放到/home目錄下
2、 在cli上設定斷點.這個比較簡單,按照如下的操作步驟即可。
(1)、smh:~ # gdb /home/netlink_daemon
gnu gdb 6.6
gdb is free software, covered by the gnu general public license, and you are
welcome to change it and/or distribute copies of it under certain conditions.
type "show copying" to see the conditions.
there is absolutely no warranty for gdb. type "show warranty" for details.
this gdb was configured as "x86_64-suse-linux"...
using host libthread_db library "/lib64/libthread_db.so.1".
(gdb) attach 3698
即可
(gdb) info sharedlibrary
from to syms read shared object library
0x00007fd42712f870 0x00007fd4271c86a8 yes /usr/lib64/libcrypto.so.0.9.8
0x00007fd426e41280 0x00007fd426f7c5f8 yes /lib/libbn_inte***ce.so
0x00007fd426d018e0 0x00007fd426d11668 yes /usr/lib64/libpcre.so.0
0x00007fd426bfe420 0x00007fd426bff138 yes /lib64/libuuid.so.1
…………………
(gdb) add-symbol-file /home/libbn_inte***ce.so 0x00007fd426e41280 //這裡/home/libbn_inte***ce.so是同一套**加-g重新編譯的
add symbol table from file "/home/libbn_inte***ce.so" at
.text_addr = 0x7fd426e41280
(y or n) y //這樣符號就加進去了。然後可以順利設定斷點!!嘿嘿嘿!!!
reading symbols from /dom/storoswd/home/libbn_inte***ce.so...done.
(gdb) b bn_disk.c:2677
breakpoint 1 at 0x7fd426e53d32: file bn_disk.c, line 2677.
從gdb的列印資訊可以看出,現在設定斷點成功了,而且斷點上顯示了除錯資訊。後面的除錯,包括檢視區域性變數,函式棧,frame,記憶體等等就變得非常方便了。也就是說,我們可以成功地除錯release版本的軟體了。
1、 通過上面的例子,我們總結了使用gdb除錯release版本軟體的一般方法。總結起來大概分如下兩個步驟:
(1)、重新編譯軟體,使得程式帶有編譯資訊
(2)、使用gdb啟動待除錯的可執行檔案,並掛接到正在執行的程序上
(3)、如有必要,則增加程式的除錯資訊至當前gdb的上下文中。
通過上面的幾個步驟,我們就可以使用gdb的所有功能了,就可以隨心所地地操作程式了。
gdb除錯使用
功夫再牛也怕菜刀,程式設計師不可能不犯錯誤,在linux下面除錯我們使用gdb,這次就講他的使用,它可以除錯c和c gdb提供的功能有 1.監視程式中的變數的值 2。設定斷點停止 執行 3,一行行的執行 使用方式很簡單,在命令列鍵入gdb就能用了,正常啟動就會有如下類似的內容,在這裡可以鍵入命令來指...
除錯Release發布版程式的Crash錯誤(一)
非常感謝作者提供了乙個系統的解決方案 在windows平台下用c 開發應用程式,最不想見到的情況恐怕就是程式崩潰,而要想解決引起問題的bug,最困難的應該就是除錯release版本了。因為release版本來就少了很多除錯資訊,更何況一般都是發布出去由使用者使用,crash的現場很難保留和重現。本文...
除錯Release發布版程式的Crash錯誤(一)
在windows平台下用c 開發應用程式,最不想見到的情況恐怕就是程式崩潰,而要想解決引起問題的bug,最困難的應該就是除錯release版本 了。因為release版本來就少了很多除錯資訊,更何況一般都是發布出去由使用者使用,crash的現場很難保留和重現。本文將給出幾個解決方案,完成對 rele...