使用gdb步驟
啟動程式的方法
- gdb + 運作程式(一般在目前目錄下,如果不是,要指定路徑)
- gdb + 運作程式 + core檔案。通過這個方法可以加載異常出錯時的堆棧資訊
- gdb + 運作程式 + 程序ID。通過這種方法可以對你正在運作的程式進行調試。
如:
$ gdb cppapplication_2.exe
設定運作時參數,有兩種方法
- 在gdb + 運作程式 + 運作參數
- 啟動了gdb後,運作set args + 運作參數
設定斷點,方法
- b(break) + 檔案名:行數
- b + 檔案名:函數 (類内部的函數不能用這種方法)
- b + 類::函數
如:
(gdb) b main.cpp:foo
Breakpoint 1 at 0x401392: file main.cpp, line 16.
(gdb) b main.cpp:36
Breakpoint 2 at 0x4013b6: file main.cpp, line 36.
(gdb) b A::printA
Breakpoint 3 at 0x401c2a: file main.cpp, line 27.
(gdb) info break
Num Type Disp Enb Address What
1 breakpoint keep y 0x00401392 in foo(int) at main.cpp:16
2 breakpoint keep y 0x004013b6 in main(int, char**) at main.cpp:36
3 breakpoint keep y 0x00401c2a in A::printA() at main.cpp:27
(gdb)
gdb調試常用參數
- r(run) : 開始運作程式;
- c(continue) : 繼續運作一直到斷點停止
- b(break) : 設定程式斷點;
- p(print) : 列印出變量值;如 p var,會把var變量的值輸出
- s(step) : 單步跟蹤,會進入函數内部
- n(next) : 單步跟蹤,不進入函數
- finish : 跳出函數調試,并列印傳回時的資訊
- u(until) : 跳出循環體
- q(quit) : 退出gdb
- l(list) : 顯示目前行後面的源程式
- bt (backtrace) : 檢視堆棧資訊
- info : 檢視各類gdb資訊以及環境資訊,比如:info break 可以檢視斷點資訊
- clear : 清除全部已定義的斷點
- delete : 删除指點的斷點号,後面接斷點号.如:
Breakpoint 4 at 0x401c36: file main.cpp, line 28.
(gdb) delete 4
(gdb) info break
No breakpoints or watchpoints.
(gdb)
我下面是我本次使用的例子
#include <stdio.h>
using namespace std;
void foo(int sum)
{
printf("sum 2: %d", sum);
return ;
}
class A
{
public:
A(){}
~A(){}
void printA()
{
printf("printf A!!");
}
};
/*
*
*/
int main(int argc, char** argv) {
int sum = 0;
for (int i= 0; i< 100; ++i)
{
sum += i;
}
printf("sum :%d", sum);
foo(sum);
A test;
test.printA();
return 0;
}