GDB的用法概要笔记

编译的时候需要加上-g参数,以打开调试信息。
例如:gcc -g -o hello hello.c
启动gdb进行调试:
shell#gdb hello
设置断点:break或简单打b后面加行号或函数名
(gdb)b function_name
(gdb)b line_number
招待程序:打入r或run后,程序就开始运行直到遇到断点停止。
(gdb)run
如果需要为程序指定命令行参数的话,参数可以跟在run后面,如:
(gdb)run 123
同样也可以使用set args来指定参数。
gdb提供两种方式:
1.单步进入,step into即跟踪到函数内。命令是step或s
2.单步,next,就是简单的单步,不会进入函数。命令是next或n
(其实如果有使用过ture C的朋友肯定对单步进入和单步这两种调试方式不陌生的。)
我们可以用l/list命令来显示源代码。
(gdb)list
不带参数,将显示当前位置之后的,或者是上一个list命令之后的十行代码。
如果带参数(-),即list -,则表示列表当前位置之前,或者上一个list命令之前的十行代码。
list命令可带的参数有:
LINENUM, 表示列出以linenum行为中心的前后共十行代码。
FILE:LINENUM, 表示列出文件FILE中以linenum为中心的前后共十行代码。
FUNCTION, 表示列出以函数FUNCTION开头为中心的前后共十行代码。
FILE:FUNCTION, 类似于FILE.LINENUM。
*ADDRESS, 列出ADDRESS地址所包括的行的前后共十行代码。
(gdb)list main //列出main函数的前后十行代码
8       {
9               printf(/"receive signal %d//n/", signum);
10              sleep(5);
11      }
12      int main(int argc,char**argv)
13      {
14              struct sigaction act;
15              int sig,i;
16
17              sigemptyset(&act.sa_mask);
(gdb)list -   //之前的十行代码
1       #include <signal.h>
2       #include <sys/types.h>
3       #include <unistd.h>
4       #include <stdio.h>
5       #include <stdlib.h>
6
7       void new_op(int signum,siginfo_t *info,void *myact)
(gdb)list //之后的十行代码 
8       {
9               printf(/"receive signal %d//n/", signum);
10              sleep(5);
11      }
12      int main(int argc,char**argv)
13      {
14              struct sigaction act;
15              int sig,i;
16
17              sigemptyset(&act.sa_mask);
设置断点,并且代码运行以后,我们可以用continue(c)/ctrl+c继续或者中止当前运行。
bt或backtrace命令可以显示栈中的内容。如下:
(gdb)bt
#0  0xb7e9029b in nanosleep () from /lib/tls/libc.so.6
#1  0xb7e900c4 in sleep () from /lib/tls/libc.so.6
#2  0x0804853c in main (argc=1, argv=0xbff50234) at test.c:32
检查表达式的值的命令是p或print格式是p <表达式>.(类似于Ture C的watch吧)。
通过上面的源代码,我们知道act是一个sigaction的结构。
(gdb) p act
$29 = {__sigaction_handler = {sa_handler = 0x80484b0 <new_op>, sa_sigaction = 0x80484b0 <new_op>},
  sa_mask = {__val = {0 <repeats 32 times>}}, sa_flags = 4, sa_restorer = 0}
(gdb) p act.sa_mask
$30 = {__val = {0 <repeats 32 times>}}
gdb的退出(quit/q):
(gdb)q
其他:
1、gdb并不一定要求启动时连同待调试的程序一起启动,可以先启动gdb然后通过file命令指定待调试的程序。gdb还支持加入core文件进行调试。gdb --silent表示不显示gdb启动的提示信息。
2、gdb的命令很多,你可以使用M-?查看一下gdb的命令列表。(M-?表示同时按下ESC+SHIFT+?)
3、查看命令的帮助:help 命令。如(gdb)help bt
4、对于gdb更详细的内容可参考原发于中科大BBS上的一篇 GDB使用手册(http://www.erya.cn/online/gdb)。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值