gdb调试和技巧

GDB调试

第一部分 命令行和使用方法
gdb常用命令在下表列出:
命令
描述
backtrace(或bt)
查看各级函数调用及参数
finish
连续运行到当前函数返回为止,然后停下来等待命令
frame(或f)
帧编号 选择栈帧
info(或i)
locals 查看当前栈帧局部变量的值
list(或l)
列出源代码,接着上次的位置往下列,每次列10行
list 行号
列出从第几行开始的源代码
list 函数名
列出某个函数的源代码
start
开始执行程序,停在main函数第一行语句前面等待命令
next(或n)count
执行下一行语句(有函数默认跳过)
step(或s)count
执行下一行语句,如果有函数调用则进入到函数中
run
继续执行到断点位置
nexti和stepi命令
用来单步执行一条机器指令,通常一条语句有多条机器指令构成的。
print(或p)
打印表达式的值,通过表达式可以修改变量的值或者调用函数
quit(或q)
退出gdb调试环境
set var
修改变量的值
clear
删除程序中所有的断点
clear 行号
删除此行中的断点
clear 函数名
删除该函数的断点
break +offset 
break -offset
在当前行号的前面或后面的offset行停住。offiset为自然数。
break filem.c:1000
多文件设置断点,在filem.c的第1000行设置断点
set args 
    show args
可指定运行时参数。(如:set args 10 20 30 40 50)
info program
查看程序的是否在运行,进程号,被暂停的原因
ignore <bnum> <count>
表示忽略断点号为bnum的停止条件count次
启动GDB的方法有以下几种:
    1、gdb <program> 
       program也就是你的执行文件,一般在当然目录下。
    2、gdb <program> core
       用gdb同时调试一个运行程序和core文件,core是程序非法执行后core dump后产生的文件。
    3、gdb <program> <PID>
       如果你的程序是一个服务程序,那么你可以指定这个服务程序运行时的进程ID。gdb会自动attach上


gdb <program> 其中<program>目录或环境变量下必须有<program>.c文件,否则找不到源码
(gdb) l
16 demo.c: No such file or directory.
尽管找不到源码,仍然可以调试,只是没有list源码进行比较


二、设置观察点(WatchPoint)
    
    观察点一般来观察某个表达式(变量也是一种表达式)的值是否有变化了,如果有变化,马上停住程序。我们有下面的几种方法来设置观察点:
    
    watch <expr>
        为表达式(变量)expr设置一个观察点。一量表达式值有变化时,马上停住程序。
        
    rwatch <expr>
        当表达式(变量)expr被读时,停住程序。
        
    awatch <expr>
        当表达式(变量)的值被读或被写时,停住程序。
    
    info watchpoints
        列出当前所设置了的所有观察点。
watch p 是查看 *(&p), 是p 变量本身。
      watch (*p) 是 p 所指的内存的内容, 查看地址,一般是我们所需要的。
      我们就是要看莫地址上的数据是怎样变化的,虽然这个地址具体位置只有编译器知道。
    c. watch 一个数组或内存区间
    char buf[128], watch buf,  
    是对buf 的128个数据进行了监视. 此时不是采用硬件断点,而是软中断实现的。
    软中断方式去检查内存变量是比较耗费cpu资源的。
在使用watch时 步骤如下
1. 使用break在要观察的变量所在处设置断点;
2. 使用run执行,直到断点;
3. 使用watch设置观察点;
4. 使用continue观察设置的观察点是否有变化。
demo:
(gdb) b 16
Breakpoint 7 at 0x804841a: file demo.c, line 16.
(gdb) c
Continuing.

Breakpoint 7, add_range (low=1, high=46) at demo.c:16
16 int i, sum=0;
(gdb) watch i
Hardware watchpoint 8: i
(gdb) c
Continuing.
Hardware watchpoint 8: i

Old value = 0
New value = 1
0x08048427 in add_range (low=1, high=46) at demo.c:17
17 for (i = low; i <= high; i++)


三、设置捕捉点(CatchPoint)

你可设置捕捉点来补捉程序运行时的一些事件。如:载入共享库(动态链接库)或是C++的异常。设置捕捉点的格式为:
catch <event>
当event发生时,停住程序。event可以是下面的内容:
1、throw 一个C++抛出的异常。(throw为关键字)
2、catch 一个C++捕捉到的异常。(catch为关键字)
3、exec 调用系统调用exec时。(exec为关键字,目前此功能只在HP-UX下有用)
4、fork 调用系统调用fork时。(fork为关键字,目前此功能只在HP-UX下有用)
5、vfork 调用系统调用vfork时。(vfork为关键字,目前此功能只在HP-UX下有用)
6、load 或 load <libname> 载入共享库(动态链接库)时。(load为关键字,目前此功能只在HP-UX下有用)
7、unload 或 unload <libname> 卸载共享库(动态链接库)时。(unload为关键字,目前此功能只在HP-UX下有用)

tcatch <event>
只设置一次捕捉点,当程序停住以后,应点被自动删除。


第二部分 调试多线程

第三部分 调试内核

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值