- 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). 在filename 的func函式 處設定斷點。(2). 舉例: b Department.hpp:Department::GetPerson ;表示在 Department.hpp 的Department 類的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 ,並將變數a 、b 傳遞給函式(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】
掃碼二維碼,關注微信公眾號,閱讀更多精彩內容