GDB除錯技巧:總結篇
阿新 • • 發佈:2018-12-16
目錄
注:原創不易,轉載請務必註明原作者和出處,感謝支援!
一 寫在開頭
1.1 本文內容
總結GDB除錯的一些常用命令和除錯技巧。不定期更新。
二 學習資料
- The GNU Project Debugger
- 《軟體除錯的藝術》 (美)馬特洛夫,(美)薩爾茲曼
三 常用命令
GDB的命令有很多,但只需要掌握下面常用的幾個便可快速上手。
簡寫 | 全稱 | 備註 |
---|---|---|
l | list | 顯示指定行號或者指定函式附近的原始碼 |
b | break | 在指定行號或者指定函式開頭處設定斷點。如b main |
r | run | 執行程式,直到程式結束或者遇到斷點而停下 |
c | continue | 在程式中斷後繼續執行程式,直到程式結束或者遇到斷點而停下。注意在程式開始執行前只能用r,不能用c |
n | next | 執行一條語句。如果有函式呼叫,則把它作為一個整體 |
s | step | 執行一條語句。如果有函式呼叫,則進入函式內部 |
u | until | 執行到指定行號或者指定函式的開頭 |
p | 顯示變數或表示式的值 | |
disp | display | 把一個表示式設定為display,當程式每次停下來時都會顯示其值 |
cl | clear | 取消斷點,和b的格式相同。如果該位置有多個斷點,將同時取消 |
i | info | 顯示各種資訊。如i b顯示所有斷點,i disp顯示display,而i lo顯示所有區域性變數 |
h | help | 獲取幫助資訊 |
四 除錯技巧
- 列印陣列中的值
列印陣列a的前6個值:p *[email protected]
列印陣列a的第6個元素開始的後4個值:p *(a+5)@4
(gdb) l
1 #include <iostream>
2 using namespace std;
3
4 int main(int argc, char ** argv)
5 {
6 int a[] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
7
8 cout << endl;
9 return 0;
10 }
(gdb)
11
(gdb) b 7
Breakpoint 1 at 0x40089a: file test.cpp, line 7.
(gdb) r
Starting program: /home/wallace/a.out
Breakpoint 1, main (argc=1, argv=0x7fffffffe528) at test.cpp:8
8 cout << endl;
(gdb) p *[email protected]
$1 = {0, 1, 2, 3, 4, 5}
(gdb) p *(a+5)@4
$2 = {5, 6, 7, 8}
(gdb)
- 同時列印多個變數的值
比如程式中有條輸入語句為cin >> n >> m >> r >> c
,你想檢視它們有沒有正確被輸入,你可以在這條語句之後同時列印它們的值。注意,同時列印的變數必須是同類型的。
(gdb) l 0
1 #include <iostream>
2 using namespace std;
3
4 int main(int argc, char ** argv)
5 {
6 int n, m, r, c;
7 n = m = r = c = 10;
8
9 return 0;
10 }
(gdb) b 8
Breakpoint 1 at 0x4006da: file test.cpp, line 8.
(gdb) r
Starting program: /home/wallace/a.out
Breakpoint 1, main (argc=1, argv=0x7fffffffe528) at test.cpp:9
9 return 0;
(gdb) p {n, m, r, c}
$1 = {10, 10, 10, 10}
(gdb)