Linux C++ 開發7 - GDB常用命令彙總(你想了解的都在這)

陌尘(MoChen)發表於2024-09-03
  • 1. 執行命令
  • 2. 設定斷點
  • 3. 檢視原始碼
  • 4. 列印表示式
  • 5. 檢視執行資訊
    • 5.1. 設定和檢視執行引數的Demo
  • 6. 分割視窗
  • 7. 參考文件

上一篇《Linux C++ 開發6 - GDB除錯》中我們講解了GDB的除錯流程和常用的除錯方法。GDB的除錯指令眾多,我們這裡針對常用的指令做一個彙總(按功能分類),以便需要時進行查閱。

1. 執行命令

命令 縮寫 說明
run r 執行程式,當遇到斷點後,程式會在斷點處停止執行,等待使用者輸入下一步的命令。
start 開始執行程式,停在main函式第一行語句前面等待命令。
continue c 繼續執行,到下一個斷點處(或執行結束)
next n 單步跟蹤程式,當遇到函式呼叫時,也不進入此函式體
step s 單步除錯如果有函式呼叫,則進入函式;與命令n不同,n是不進入呼叫的函式
return 結束當前呼叫函式並返回指定值,到上一層函式呼叫處停止程式執行。
finish fi 執行程式,直到當前函式完成返回,並列印函式返回時的堆疊地址和返回值及引數值等資訊。
until (1). until: 當你厭倦了在一個迴圈體內單步跟蹤時,這個命令可以執行程式直到退出迴圈體。
(2). until 行號: 執行至某行,不僅僅用來跳出迴圈。
jump j 使程式從當前要執行的程式碼處,直接跳轉到指定位置處繼續執行後續的程式碼。
call (1). 呼叫程式中可見的函式,並傳遞“引數”。
(2). 使用方法舉例:call gdb_test(55)
quit q 退出gdb

2. 設定斷點

命令 縮寫 說明
break n b n 在第n行處設定斷點。
break filename:n b filename:n (1). 在filename第n行設定斷點。
(2). 舉例:b company.cpp:578
break func b func (1). 在函式func()的入口處設定斷點。
(2). 舉例:break cb_button
break filename:func b filename:func (1). 在filenamefunc函式處設定斷點。
(2). 舉例: b Department.hpp:Department::GetPerson;
表示在Department.hppDepartment類的GetPerson成員函式設定斷點。
info breakpoints info b
i b
顯示所有斷點設定情況
disable n 禁用第n個斷點
enable n 啟用第n個斷點
delete n d n 刪除第n個斷點
clear n 清除第n行的斷點
delete breakpoints d breakpoints 清除所有斷點

3. 檢視原始碼

命令 縮寫 說明
list l 列出程式的原始碼,預設每次顯示10行。
list n l n 列出當前檔案以“第n行”為中心的前後10行程式碼,如:list 12
list +n l +n 顯示距當前所在行後n行處的源程式。
list -n l -n 顯示距當前所在行前n行處的源程式。
list func l func 顯示func函式所在位置的原始碼,如:list main
list l 不帶引數,將接著上一次 list 命令的,輸出下邊的內容。
list . l . 列出當前所在檔案開始位置的程式碼。
list filename:n l filename:n 列出filename檔案第n行位置的程式碼,如:l Department.hpp:30

4. 列印表示式

命令 縮寫 說明
print a p a 列印變數a的值。
print ++a p ++a 將把a中的值加1,並列印出來。
print add(2, 3) p add(2, 3) 呼叫函式add,並傳遞引數(2, 3),列印函式執行結果。
print add(a, b) p add(a, b) 呼叫函式add,並將變數ab傳遞給函式(a, b),列印函式執行結果。
display expression 每次程式暫停時顯示指定表示式(expression)的值。
watch expression 設定一個監視點,一旦被監視的表示式(expression)的值改變,gdb將強行終止正在被除錯的程式。如: watch a
whatis 查詢變數或函式,如:whatis add; whatis a
info function 列出函式列表。
info locals 列印當前堆疊頁的所有變數。

5. 檢視執行資訊

命令 縮寫 說明
backtrace bt 顯示當前呼叫堆疊。
where/info stack bt的功能完全相同, 顯示當前呼叫堆疊。
up 在呼叫堆疊中向上移動,即切換到呼叫當前函式的上一層堆疊幀。
down 在呼叫堆疊中向下移動,即切換到被當前函式呼叫的下一層堆疊幀。
frame n f n 選擇當前堆疊的第n幀。
set args 用於設定程式執行時的引數。這些引數將傳遞給程式的 main 函式,類似於在命令列中執行程式時傳遞的引數。參見下面的Demo。
show args 用於檢視當前設定的程式執行時引數。這些引數將傳遞給程式的 main 函式,類似於在命令列中執行程式時傳遞的引數。
info program 來檢視程式的是否在執行,程序號,被暫停的原因。

5.1. 設定和檢視執行引數的Demo

demo03.cpp:

#include <iostream>

int main(int argc, char* argv[])
{
    for (int i = 0; i < argc; ++i)
    {
        std::cout << "argument " << i << ": " << argv[i] << std::endl;
    }
    return 0;
}

編譯demo03.cpp:

g++ -g ./demo03.cpp -o ./demo03.out

除錯並執行:

gdb -q ./demo03.out
Reading symbols from ./demo03.out...
# 設定執行引數
(gdb) set args arg1 arg2
# 顯示執行引數
(gdb) show args 
Argument list to give program being debugged when it is started is "arg1 arg2".
# 執行程式
(gdb) r
Starting program: /mnt/d/workspace/blog/source/_posts/cpp_linux/demo/demo03.out arg1 arg2
[Thread debugging using libthread_db enabled]
Using host libthread_db library "/lib/x86_64-linux-gnu/libthread_db.so.1".
argument 0: /mnt/d/workspace/blog/source/_posts/cpp_linux/demo/demo03.out
argument 1: arg1
argument 2: arg2
[Inferior 1 (process 323) exited normally]

上面這種透過set args的方式設定引數,與下面這種透過--args的方式是一樣的。

# 也可以使用 --args 選項來設定引數
gdb -q --args ./demo03.out arg1 arg2
Reading symbols from ./demo03.out...
# 執行程式
(gdb) r
Starting program: /mnt/d/workspace/blog/source/_posts/cpp_linux/demo/demo03.out arg1 arg2
[Thread debugging using libthread_db enabled]
Using host libthread_db library "/lib/x86_64-linux-gnu/libthread_db.so.1".
argument 0: /mnt/d/workspace/blog/source/_posts/cpp_linux/demo/demo03.out
argument 1: arg1
argument 2: arg2
[Inferior 1 (process 549) exited normally]

6. 分割視窗

layout指令用於分割視窗,可以一邊檢視程式碼,一邊除錯。

命令 說明
layout src 顯示原始碼視窗。
layout asm 顯示反彙編視窗。
layout regs 顯示原始碼/反彙編和CPU暫存器視窗。
layout split 顯示原始碼和反彙編視窗。
Ctrl + L 重新整理視窗

7. 參考文件

https://blog.csdn.net/niyaozuozuihao/article/details/91802994


大家好,我是陌塵。

IT從業10年+, 北漂過也深漂過,目前暫定居於杭州,未來不知還會飄向何方。

搞了8年C++,也幹過2年前端;用Python寫過書,也玩過一點PHP,未來還會折騰更多東西,不死不休。

感謝大家的關注,期待與你一起成長。



【SunLogging】
Linux C++ 開發7 - GDB常用命令彙總(你想了解的都在這)
掃碼二維碼,關注微信公眾號,閱讀更多精彩內容

相關文章