使用gdb+gdbserver調試應用程序

使用gdb調試應用程序

目錄

一、gdb基本使用

​ GDB是一個由GNU開源組織發佈的、UNIX/LINUX操作系統下的、基於命令行的、功能強大的程序調試工具。 對於一名Linux下工作的c++程序員,gdb是必不可少的工具;

1. 啓動gdb

​ 對於C/C++程序,編譯的時候需要加上 -g 參數生成調試信息。如:gcc -g hello.c -o hello

  • 調試可執行程序

    $gdb 程序名稱
    $gdb ./hello  # 調試當前目錄下名稱爲hello的程序
  • 調試服務程序

    $gdb 程序名稱 進程pid
    $gdb hello  5678 # 調試當前目錄下名稱爲hello,進程pid爲5678的程序
  • 調試core文件(程序崩潰後生成的core dump 文件)

    $gdb 程序名稱 core文件名稱
    $gdb hello  core.0609 # 調試當前目錄下名稱爲hello,core文件名稱爲core.0609的程序

2. gdb交互式命令

​ 啓動gdb後,進入到交互模式,通過以下命令完成對程序的調試;高頻使用的命令一般都會有縮寫,熟練使用這些縮寫命令能提高調試的效率;

運行

  • run:縮寫爲 r,運行程序,當遇到斷點後停止,程序會在斷點處停止運行,等待用戶輸入下一步的命令,類似於vs中的 F5
  • continue: 縮寫爲 c,繼續執行,到下一個斷點(沒有斷點就運行到程序結束)。
  • step: 縮寫爲 s,單步調試如果遇到函數則進入函數;與命令n不同,n是不盡然調用的函數的,step 相當於vs的 F11
  • next:縮寫爲 n,單步跟蹤程序,當遇到調用函數時不進入函數;此命令與step的主要區別是,step 遇到用戶自定義的函數,進步入到函數中運行,而 next 則是直接調用函數,不會進入到函數內,next 相當於vs的 F10
  • until: 當進入到循環中時,使用until命令可以使程序直接運行到退出循環體。
  • until+行號:運行至指定行,不僅僅用來跳出循環。
  • finish: 運行程序,知道當前函數返回,並打印函數返回時的堆棧地址和返回值及參數值等信息。
  • call 函數(參數) : 調用程序中的函數,並傳遞“參數”,如: call add(3,2)
  • quit: 縮寫爲q,退出gdb。

設置斷點

gdb使用break(縮寫爲 b) 來設置斷點,具體使用如下:

  • break n (簡寫 b n),在第 n 行處設置斷點(可以寫上代碼路徑和文件名稱,如b ./test.cpp:10)
  • b fn1 if a>b ,設置條件斷點。
  • b func ,在函數func()入口處設置斷點。
  • info b (info breakpoints)顯示當前程序的斷點設置情況和斷點的斷點號等信息。
  • disable 斷點號n, 禁用第n個斷點。
  • enable 斷點號n,啓用第n個斷點。
  • delete 斷點號n,刪除第n個斷點。
  • delete breakpoints,清除所有斷點。
  •  

查看源代碼

  • list 簡記爲 l : 列出程序的源代碼,默認每次顯示10行。
  • list 行號:將顯示當前文件以“行號”爲中心的前後10行代碼,如:list 12
  • list 函數名:將顯示“函數名”所在函數的源代碼,如:list main
  • list:不帶參數,將接着上一次 list 命令的,輸出下邊的內容。

打印表達式

  • print 表達式:簡記爲 p ,其中“表達式”可以是任何當前正在被測試程序的有效表達式,比如當前正在調試C語言的程序,那麼“表達式”可以是任何C語言的有效表達式,包括數字,變量甚至是函數調用。
  • print a:將顯示整數 a 的值
  • print ++a:將把 a 中的值加1,並顯示出來
  • print name:將顯示字符串 name 的值
  • print gdb_test(22):將以整數22作爲參數調用 gdb_test() 函數
  • print gdb_test(a):將以變量 a 作爲參數調用 gdb_test() 函數
  • display 表達式:在單步運行時將非常有用,使用display命令設置一個表達式後,它將在每次單步進行指令後,緊接着輸出被設置的表達式及值。如: display a
  • watch 表達式:設置一個監視點,一旦被監視的“表達式”的值改變,gdb將強行終止正在被調試的程序。如: watch a
  • whatis:查詢變量或函數
  • info function: 查詢函數
  • 擴展info locals: 顯示當前堆棧頁的所有變量

查詢查詢運行信息

  • where/bt :當前運行的堆棧列表;
  • bt backtrace 顯示當前調用堆棧
  • up/down 改變堆棧顯示的深度
  • set args 參數:指定運行時的參數
  • show args:查看設置好的參數
  • info program: 來查看程序的是否在運行,進程號,被暫停的原因。

分割窗口

  • layout:用於分割窗口,可以一邊查看代碼,一邊測試:

  • layout src:顯示源代碼窗口

  • layout asm:顯示反彙編窗口

  • layout regs:顯示源代碼/反彙編和CPU寄存器窗口

  • layout split:顯示源代碼和反彙編窗口

  • Ctrl + L:刷新窗口

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章