注:下面只列了一些基本的信息及方法,更多方法及技巧请多利用搜索工具。。。
参考信息:http://blog.csdn.net/whf727/article/details/1768056
一、GDB帮助信息获取方式
1.命令行中键入gdb回车即可直接进去gdb
2.进入gdb后,可以利用gdb内部的帮助信息来入手:
(gdb) help
List of classes of commands:
aliases -- Aliases of other commands(别名)
breakpoints -- Making program stop at certain points(断点)
data -- Examining data(数据)
files -- Specifying and examining files(文件)
internals -- Maintenance commands(维护)
obscure -- Obscure features(设置)
running -- Running the program(运行)
stack -- Examining the stack(堆栈)
status -- Status inquiries(状态信息显示)
support -- Support facilities
tracepoints -- Tracing of program execution without stopping the program
user-defined -- User-defined commands
3.继续执行help breakpoints,可以看到更详细的信息:
(gdb)help breakpoints
break -- Set breakpoint at specified line or function
catch -- Set catchpoints to catch events
watch -- Set a watchpoint for an expression
clear -- Clear breakpoint at specified line or function
delete -- Delete some breakpoints or auto-display expressions
disable -- Disable some breakpoints
enable -- Enable some breakpoints
... ...
更多详细的帮助信息可以在使用的时候查看,一般只需要了解一部分命令即可;
二、GDB使用示例
1.示例文件hello.c
#include <stdio.h>
int main(int argc, char *argv[])
{
printf("hello, world.\n");
return 0;
}
2.编译
编译必须带-g选项,否则不能进行调试;
gcc -g -o hello hello.c
3.调试
调试方法有三种:
1)gdb 可执行程序
gdb hello
2)进入gdb后,使用file 可执行程序,进入调试
gdb
(gdb)file hello
3.调试一个正在运行的程序
(gdb)attch 进程号
命令执行后,程序会阻塞
(gdb)detach
命令执行后,会释放当前调试的程序,原程序继续执行。
三、基本的调试命令
注:下面只列了一些基本的命令
基本的调试命令在help帮助文档里均有描述,这里只列出部分常用的命令的说明。
1.list(l)——括号内为命令的缩写
显示当前运行的、前后10行(默认10)源代码(个人描述可能有误,以实际显示为准)
上面的例子程序没有10行,使用list命令后,会在屏幕上打印出整个程序代码;
可以使用命令list 20来显示20行代码,根据个人需求进行显示;
可以使用命令list 5,20来显示5-20行代码;
(可执行程序必须与源代码关联在一起,移动可执行程序后,list命令无法打印源代码)
2.break(b)
设置断点
break 函数名
break main——在入口函数main设置断点
break 行数
break 10——在当前源文件的第10行设置断点
break 文件:函数/行数
break (path)/hello.c:10——在某个目录下的源文件hello.c的第10行设置断点
break (path)/hello.c:main——在某个目录下的源文件hello.c的函数main处设置断点
3.info(i)
查看命令信息
info break——查看设置的断点信息
Num Type Disp Enb Address What
1 breakpoint ...
2 breakpoint ...
3 breakpoint ...
info thread——查看线程信息
4.delete(d)
删除断点信息
delete——删除所有断点
delete 1——删除上述显示的第1个断点
5.run(r)/start
run——运行程序,停在第一个断点,若没有断点则顺序执行下去
start——停在程序最开始
6.next(n)/step(s)
单步跟踪
next——单步执行,在函数口时,不进入函数
step——单步执行,在函数口时,进入函数内部
7.print(p)
打印变量/指针等信息
print var_1——打印变量var_1的值
print ptr——打印指针ptr指向的地址
print *ptr——打印指针ptr指向的地址的值
8.continue/quit/watch/whatis/...
continue——继续执行
quit——推出dbg
watch——观察变量变化
whatis——查看变量类型
9.gdb参数设置方式
(gdb)run 参数1 参数2 ...
或者:
(gdb)set args 参数1 参数2 ...
(gdb)run
10.其它命令
break 20 if var_1 > 10——在第20行观察变量var_1的变化
当变量var_1的值大于10时,程序停在断点处
watch var_1 > 10
当变量var_1大于10时,程序停在断点处
区别:
break在每次满足条件时都会停止执行,watch只在第一次满足条件时才停止下来
break适合观察具体的某行,watch适合观察庞大的代码中任何一处满足条件的地方
11.调试core文件
在空指针访问等情况下,可执行程序会产生一个core文件,并停止执行。
注:产生core文件需要设置一些条件,可以查看ulimit命令的使用,具体不赘述。
如core文件的名称为:core.1234
使用命令:gdb hello core.1234即可进入调试core文件环境;
使用bt命令可以打印当前可执行文件崩溃时的堆栈信息如下:
#0 0x0804854c in ...
#1 0x0804850a in ...
#2 0x005703cc in ...
#3 0x003f9c3e in ...
(gdb)frame 1
切换到堆栈1的环境
(gdb)info local
查看当前堆栈的变量环境
(gdb)info args
显示当前堆栈的参数信息