1、生成调试信息
一般来说GDB主要调试的是C/C++的程序。要调试C/C++的程序,首先在编译时,我们必须要把调试信息加到可执行文件中。
使用编译器(gcc/g++)的 -g 参数:
gcc -g hello.c -o hello
g++ -g hello.cpp -o hello
如果不加参数 -g,将看不见程序的函数名、变量名,所代替的全是运行时的内存地址。?
?2、启动?gdb?工具
测试代码:
void func()
{
for(int i = 0;i<10;i++)
{
printf("i = %d\n",i);
}
}
int main(int argc,char **argv )
{
int i = 0;
for(i = 0;i<argc;i++)
{
printf("argv[%d]:%s\n",i,argv[i]);
}
func();
printf("Hello world!\n");
return 0;
}
3、显示源代码
用 list 命令来打印程序的源代码。默认打印10行。
- list linenum: 打印第linenm行的上下文内容.
- list function: 显示函数名为function的函数的源程序。
- ?list: 显示当前行后面的源程序。
- list -: 显示当前行前面的源程序。
- set listsize ?count:设置一次显示源代码的行数。
- show listsize: 查看当前listsize的设置。
?4、断点操作
1)简单断点
break 设置断点,可以简写为b
- b 10 设置断点,在源程序第10行
- b func 设置断点,在func函数入口处
- info break 显示所有断点
- n 下一步
2)多文件设置断点
C++中可以使用class::function或function(type,type)格式来指定函数名。
如果有名称空间,可以使用namespace::class::function或者function(type,type)格式来指定函数名。
- break filename:linenum -- 在源文件filename的linenum行处停住
- break filename:function -- 在源文件filename的function函数的入口处停住
- break class::function或function(type,type) -- 在类class的function函数的入口处停住
- break namespace::class::function -- 在名称空间为namespace的类class的function函数的入口处停住
3)查询所有断点
- info b
- info break
- i break
- i b
?5、条件断点
为断点设置一个条件,使用if关键词,后面跟其断点条件。
设置一个条件断点:
在测试代码的 17 行中当 i 为 5 时,设置一个断点
?6、维护断点
|