gdb 調試

1、gdb 調試-源代碼關聯html

  在調試程序的過程當中,能夠自由地查看相關的源代碼(若是有源代碼的話)是一項最基本的特性。gdb 固然也提供了這項特性,雖然不如IDE直觀,但在必定程度上要比IDE更加靈活和快捷。
gdb之因此可以知道對應的源代碼,是由於調試版的可執行程序中記錄了源代碼的位置;由於源代碼的位置在編譯以後可能會移動到其它地方,因此gdb還會在當前目錄中查找源代碼,另外gdb也容許明確指定源代碼的搜索位置。
  在一個調試會話中,gdb維護了一個源代碼查找目錄列表,默認值是編譯目錄和當前工做目錄。當gdb須要一個源文件的時候,它依次在這些目錄中查找,直到找到一個或者拋出錯誤。
gdb還維護了一個路徑替換規則,將要搜索的原始路徑按照找到的第一個規則作前綴替換,而後再在源碼搜索目錄中查找文件。linux

     所以,源代碼關聯默認狀況下搜索路徑以下:sass

  1. gdb在編譯時目錄中搜索 ($cdir : compilation directory)
  2. 當前目錄中搜索 ($cwd : current working directory)
  3. 源代碼搜索目錄列表 (substitute-path)

 除了默認搜索路徑,還能夠經過以下方式來設置源代碼搜索位置和替換規則 函數

  1. gdb容許明確指定源代碼位置,以應付源代碼位置遷移的狀況。
    • directory path-list:將一個或者多個源代碼搜索目錄加入到當前源碼搜索目錄列表的前面,目錄之間使用空格間隔。
    • directory:不帶參數的directory將源碼搜索目錄恢復爲默認值。
    • set directories path-list:將源碼目錄設置爲path-list,可是會補上默認目錄(同 directory path-list)。
    • show directories:顯示源碼搜索目錄列表。

  2. gdb容許設置路徑替換規則,以應付源代碼位置遷移的狀況。spa

    • set substitute-path from to   :設置目錄替換規則,放置在規則列表的末端。
    • unset substitute-path [path] :刪除path對應的替換規則,或者刪除全部的替換規則。
      show substitute-path [path] :顯示path對應的替換規則,或者顯示全部的替換規則。

2、gdb 動態庫搜索路徑

  當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 

3、gdb 調試-查看機器碼

   在一些必要的時候,咱們須要查看彙編代碼來診斷問題。gdb 提供了這種可能。

  gdb提供了兩種能力:

    • 顯示源代碼位置與指令地址之間的映射;
    • 顯示指定位置的彙編代碼。
  1. info line xx
    • info line linespec:顯示源代碼linespec處對應的彙編地址範圍。linespec 能夠是函數名
    • info line *addr:顯示地址addr處對應的源代碼位置。

   2.  disassemble,disassemble /m  [/m表示混合輸出源代碼和彙編代碼],disassemble /r [/r表示混合輸出二進制和彙編代碼]

      顯示指定地址範圍內的彙編代碼,有4種使用形式: [參數能夠是16進制的地址,也能夠是函數名]

    • 第一種不帶參數,顯示當前正在執行的函數的彙編代碼;
    • 第二 種是一個參數,顯示該地址所在函數的彙編代碼;
    • 第三種是兩個參數的disassemble start,end,顯示地址[start,end)內的彙編代碼;
    • 第四種是兩個參數的 disassemble start,+length,顯示地址[start,start+length)內的彙編代碼。

    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格式,只是用得比較少。

4、 gdb + gdbsever 聯合調試

 

 

 

 

 

 

 

 

 

 

 

參考:

    [1]. 使用GDB進行調試:  http://www.cnblogs.com/frydsh/p/3367015.html

  [2]. 使用GDB的源代碼查看功能: http://www.cnblogs.com/frydsh/p/3388828.html

相關文章
相關標籤/搜索