常用gdb调试技巧整理

启动方法

1.gdb <program>
2.gdb <program> core
3.gdb <program> <PID>

=============================================================================================================

命令行参数

gdb命令行的 -args 参数
gdb环境中 set args 命令

=============================================================================================================

gdb中变量

可以查看运行时的变量,也可以直接设置程序中的变量,以模拟一些很难在测试中出现的情况,比较一些出错,或是switch的分支语句。使用set命令可以修改程序中的变量。
另外gdb也有变量,gdb的变量以$开头,比如打印数组中的每个元素,可以:
(gdb) set $i = 0
(gdb) p a[$i++]
.......然后一路回车下去了。


=============================================================================================================

常用命令

r ============>运行程序, run 命令简写
c ============>继续运行程序,continue命令缩写
l ============>列出源码,list 命令简写
b ============>设置断点,具体请看下面一节
info break============>查看断点信息
n ============>单条语句执行,不进入函数,next 命令缩写
s ============>单条语句执行,进入函数,step命令缩写
p i ============>打印变量值,print命令缩写
display i ============>显示变量值,后面每行都会显示
bt ============>查看函数堆栈,backtrace命令缩写
finish ============>退出函数
q ============>退出gdb
直接回车 ============>重复上一条命令
shell <command string> ============>在gdb中运行shell脚本
ptype ============>显示变量的数据类型
x/[n][format][size] address ============>查看内存
[n] n为要打印的对象数目
[format] 格式字符,o(octal), x(hex), d(decimal), u(unsigned decimal),t(binary), f(float), a(address), i(instruction), c(char) and s(string)
[size] size指示符,b(byte), h(halfword), w(word), g(giant, 8 bytes)

===============================================================================================================

断点相关

break func ===============>在函数func入口处设置断点
break file.c:100 ===============>在file.c第100行设置断点
break [where] if [condition] ===============>设置条件断点
break file.c:100 thread all ===============>在file.c文件第100行处,为所有经过这里的线程设置断点
info break ===============>查看断点列表,会显示id号
delete id ===============>删除断点
clear func ===============>删除断点,不需要id,格式同break
break xxxxx if a==1 ===============>条件断点
condition N COND ===============>条件断点,N为断点号码,COND为条件

info thread ===============>查看thread信息
t <thread id> ===============>切换到id进程,thread命令缩写



在gdb中,有几种暂停方式: 断点(breakpoint),观察点(watchpoint),捕捉点(catchpoint),信号(signals),线程停止(Thread Stops)
在gdb停住时,可以用info program来查看程序是否在运行,进程号,被暂停的原因。可以用continue来恢复程序运行

多线程调试
1.调试已运行的程序
1)ps查看PID,然后gdb <program> PID挂接正在运行的程序
2)gdb <program>关联上源代码,并进行gdb,在gdb中用attach命令来挂接进程的PID,用detach来取消挂接的进程。
2.
info thread 查看当前进程的线程
thread <id> 切换调试的线程为指定id的线程,t <id>
break file.c:100 thread all ===============>在file.c文件第100行处,为所有经过这里的线程设置断点
set scheduler-locking off|on|step,在使用step或者continue命令调试当前被调试线程的时候,其他线程也是同时执行的,怎么只让被调试线程执行呢?通过这个命令就可以实现这个需求。
off 不锁定任何线程,也就是所有线程都执行,这是默认值。
on 只有当前被调试程序会执行。
step 在单步的时候,除了next过一个函数的情况(熟悉情况的人可能知道,这其实是一个设置断点然后continue的行为)以外,只有当前线程会执行。

=================================================================================================================

调试宏

在gcc编译的时候,加上-ggdb3参数,就可以调试宏了。
info macro - 查看这个宏在那些文件被引用了,以及宏定义是什么样子的。
macro - 查看宏展开的样子

==================================================================================================================

自动化调试


使用command命令,简单的理解一下,其就是把一组gdb的命令打包,有点像字处理软件的“宏”。下面是一个示例:

(gdb) break func
Breakpoint 1 at 0x3475678: file test.c, line 12.
(gdb) command 1
Type commands for when breakpoint 1 is hit, one per line.
End with a line saying just "end".
>print arg1
>print arg2
>print arg3
>end
(gdb)
当我们的断点到达时,自动执行command中的三个命令,把func的三个参数值打出来。

========================================================================================================================

gdb server

这个主要是针对一些没有安装gdb的嵌入式设备
1)在目标target host上开启gdbserver
>>>>gdbserver <target host ip>:2345[这个端口可以自己根据需要设置] test
2)到host端,也就是安装有gdb的主机
>>>gdb test
[>>>set solib-absolute-prefix <gdb directory>]
[>>>set solib-search-path <gdb directory/lib或者其他库文件的路径>]
>>>target remote <target host ip>:2345

这时,就可以在host端来调试target上的程序了

水平有限,如果有朋友发现错误,欢迎留言交流。
转载请保留本文链接,如果觉得我的文章能帮到您,请顶一下。,谢谢。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值