使用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;
}