1、gdb 調試-源代碼關聯html
在調試程序的過程當中,能夠自由地查看相關的源代碼(若是有源代碼的話)是一項最基本的特性。gdb 固然也提供了這項特性,雖然不如IDE直觀,但在必定程度上要比IDE更加靈活和快捷。
gdb之因此可以知道對應的源代碼,是由於調試版的可執行程序中記錄了源代碼的位置;由於源代碼的位置在編譯以後可能會移動到其它地方,因此gdb還會在當前目錄中查找源代碼,另外gdb也容許明確指定源代碼的搜索位置。
在一個調試會話中,gdb維護了一個源代碼查找目錄列表,默認值是編譯目錄和當前工做目錄。當gdb須要一個源文件的時候,它依次在這些目錄中查找,直到找到一個或者拋出錯誤。
gdb還維護了一個路徑替換規則,將要搜索的原始路徑按照找到的第一個規則作前綴替換,而後再在源碼搜索目錄中查找文件。linux
所以,源代碼關聯默認狀況下搜索路徑以下:sass
除了默認搜索路徑,還能夠經過以下方式來設置源代碼搜索位置和替換規則 函數
2. gdb容許設置路徑替換規則,以應付源代碼位置遷移的狀況。spa
當gdb沒法顯示so動態庫的信息或者顯示信息有誤時,一般是因爲庫搜索路徑錯誤致使的,可以使用set sysroot、set solib-absolute-prefix、set solib-search-path來指定庫搜索路徑。.net
1. set sysroot 與 set solib-absolute-prefix 是同一條命令,實際上,set sysroot是set solib-absolute-prefix 的別名。調試
2. set solib-search-path設置動態庫的搜索路徑,該命令可設置多個搜索路徑,路徑之間使用「:」隔開(在linux中爲冒號,DOS和Win32中爲分號)。code
3. set solib-absolute-prefix 與 set solib-search-path 的區別:htm
整體上來講solib-absolute-prefix設置庫的絕對路徑前綴,只對絕對路徑有效;而solib-search-path設置庫的搜索路徑,對絕對路徑和相對路徑均起做用。blog
(編譯器自動連接的so庫多采用絕對路徑)。
在載入動態庫信息時Coredump會碰到兩種路徑:絕對路徑和相對路徑。編譯時連接的庫一般是絕對路徑,例如"/lib/libc.so.6"、"/lib/libdl.so.2"等,
此時在Coredump文件中也一樣保存爲絕對路徑;而程序用dlopen函數載入的so庫可能使用相對路徑,例如"./libddd.so",此時Coredump文件原封不動地保存相同的路徑。
爲便於表述,用A表示set solib-absolute-prefix設置的路徑,R(A)表示A去掉根前綴後的路徑(即去掉前綴「/」符號),用Bn表示set solib-search-path設置的每一條路徑,
用X表示Coredump中保存的庫路徑,即待搜索的庫文件路徑,F(X)表示X中去掉目錄後的文件名(路徑最後「/」符號後的字符串)。
1) A / X ; 先添加solib-absolute-prefix前綴進行搜索,成功則再也不繼續,不然繼續2)
2) R(A) / X ; 再把1)的根前綴去掉後進行搜索,成功則再也不繼續,不然繼續3)
3) Bn / R(A) / X ; 再在2)的基礎上逐一添加solib-search-path中的每條路徑進行搜索,成功則再也不繼續,不然繼續4)
4) Bn / F(X) ; 再只使用2)中的文件名(去掉目錄段),並逐一添加solib-search-path中的每條路徑進行搜索,成功則再也不繼續,不然繼續5)
5) $PATH / R(A) / X ; 在2)的基礎上使用環境變量$PATH中的每條路徑進行搜索,成功則再也不繼續,不然繼續6)
6) $LD_LIBRARY_PATH / R(A) / X ;在2)的基礎上使用環境變量$LD_LIBRARY_PATH中的每條路徑進行搜索,成功則再也不繼續,不然繼續7)
7) 返回失敗
1) X ; 直接使用原始路徑進行搜索,成功則再也不繼續,不然繼續2)
2) Bn / X ; 再逐一添加solib-search-path中的每條路徑進行搜索,成功則再也不繼續,不然繼續3)
3) Bn / F(X) ; 再只使用文件名(去掉目錄段),並逐一添加solib-search-path中的每條路徑進行搜索,成功則再也不繼續,不然繼續4)
4) $PATH / X ; 再使用環境變量$PATH中的每條路徑進行搜索,成功則再也不繼續,不然繼續5)
5) $LD_LIBRARY_PATH / X ; 再使用環境變量$LD_LIBRARY_PATH中的每條路徑進行搜索,成功則再也不繼續,不然繼續6)
6) 返回失敗
GDB動態庫搜索路徑: http://blog.csdn.net/_xiao/article/details/23289971
在一些必要的時候,咱們須要查看彙編代碼來診斷問題。gdb 提供了這種可能。
gdb提供了兩種能力:
2. disassemble,disassemble /m [/m表示混合輸出源代碼和彙編代碼],disassemble /r [/r表示混合輸出二進制和彙編代碼]
顯示指定地址範圍內的彙編代碼,有4種使用形式: [參數能夠是16進制的地址,也能夠是函數名]
set disassembly-flavor instruction-set:設置顯示彙編代碼時使用的風格,目前只針對intel x86系列,可取的值爲att和intel,默認是att。
show disassembly-flavor:顯示disassembly-flavor設置
set disassemble-next-line on|off|auto:當程序中止下來的時候,是否顯示下一行源代碼的彙編代碼,默認爲off。
show disassemble-next-line:顯示disassemble-next-line設置。
默認狀況時,gdb和gcc輸出的彙編都是AT&T格式的,可是它們都有方式來轉換爲Intel格式。 gcc -S -masm=intel test.c
gdb則是設置環境變量 set disassembly-flavor intel gas事實上也支持Intel格式,只是用得比較少。
參考:
[1]. 使用GDB進行調試: http://www.cnblogs.com/frydsh/p/3367015.html
[2]. 使用GDB的源代碼查看功能: http://www.cnblogs.com/frydsh/p/3388828.html