linux下gdb调试命令

来源:互联网 发布:网络教育要交几年学费 编辑:程序博客网 时间:2024/05/16 10:07


注:下面只列了一些基本的信息及方法,更多方法及技巧请多利用搜索工具。。。

参考信息: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命令可以打印当前可执行文件崩溃时的堆栈信息如下:

(gdb) bt
#0  0x0804854c in ...
#1  0x0804850a in ...
#2  0x005703cc in ...
#3  0x003f9c3e in ...


(gdb)frame 1

切换到堆栈1的环境


(gdb)info local

查看当前堆栈的变量环境


(gdb)info args

显示当前堆栈的参数信息


原创粉丝点击