gdb ..

gdb是GNU开源组织发布的一个强大的Linux下的程序调试工具。一般来说,GDB主要帮助你完成下面四个方面的功能:
1、启动你的程序,可以按照你的自定义的要求随心所欲的运行程序。
2、可让被调试的程序在你所指定的调置的断点处停住。(断点可以是条件表达式)
3、当程序被停住时,可以检查此时你的程序中所发生的事。
4、你可以改变你的程序,将一个BUG产生的影响修正从而测试其他BUG。
 
一、普通命令
(gdb)help:查看命令帮助,具体命令查询在gdb中输入help + 命令,简写h
(gdb)run:重新开始运行文件(run-text:加载文本文件,run-bin:加载二进制文件),简写r
(gdb)start:单步执行,运行程序,停在第一执行语句。
(gdb)list:查看原代码(list-n,从第n行开始查看代码。list+ 函数名:查看具体函数),简写l
(gdb)set:设置变量的值
(gdb)next:单步调试(逐过程,函数直接执行),简写n
(gdb)step:单步调试(逐语句:跳入自定义函数内部执行),简写s
(gdb)backtrace:查看函数的调用的栈帧和层级关系,简写bt
(gdb)bt full:不仅显示backtrace,还显示局部变量。
(gdb)frame:切换函数的栈帧,简写f
(gdb)info:查看函数内部局部变量的数值,简写i
(gdb)finish:结束当前函数,返回到函数调用点
(gdb)continue:继续运行,简写c
(gdb)print:打印值及地址,简写p
(gdb) p *array@len : 显示数组, p相当于print,array就是数组首地址,也可以是数组名,len是想要显示的数组的长度。
(gdb)quit:退出gdb,简写q
(gdb)break+num:在第num行设置断点,简写b
(gdb) break 9 if sum != 0 :满足条件才激活断点
(gdb)info breakpoints:查看当前设置的所有断点
(gdb)delete breakpoints num:删除第num个断点,简写d
(gdb)display:追踪查看具体变量值
(gdb)undisplay:取消追踪观察变量
(gdb)watch:被设置观察点的变量发生修改时,打印显示。比如: watch input[ 4 ]
(gdb)i watch:显示观察点
(gdb)enable breakpoints:启用断点
(gdb)disable breakpoints:禁用断点
(gdb) x/<n/f/u> <addr>:查看内存, n、f、u是可选的参数。 <addr>表示一个内存地址。(比如: x/3uh 0x54320 表示,从内存地址0x54320读取内容,h表示以双字节为一个单位,3表示输出三个单位,u表示按十六进制显示。 )
(gdb)run argv[1] argv[2]:调试时命令行传参。
 
二、高级命令
1、调试设置参数的方法,有两种:
1)run 参数1 参数2 参数n
2)set args 参数1 参数2 参数n
可用 show args 查看。
 
2、gdb调试已在运行的进程
gdb -p <进程号>
或者:
gdb attach <进程号>
 
1.1)通过命令:ps -aux | grep 进程名(比如:main) ,获取执行main的进程(pid),比如获取到pid:10001
1.2)启动gdb attach,执行gdb attach pid即可调试正在运行的程序,输入命令:gdb attach 10001
若执行gdb attach时提示:” ptrace: Operation not permitted”,说明权限不够,切换root用户运行,执行:sudo gdb attach 10001
1.3)设置 源码映射,对源码路径重新设置。 [可选]
set substitute-path /home/johnchen1/workspace/OldCode /home/johnchen2/other/NewCode
源码路径:/home/johnchen1/workspace/OldCode
实际代码路径:/home/johnchen2/other/NewCode
用实际代码替换源码,此过程需要包版本和代码版本一致。
1.4)设置断点
b xxx.cpp:100
//调试xxx.cpp文件,断点为100行。
1.5)已是运行中的程序不需要启动(r),继续(c)即可。
1.6)等待指令或报文触发断点,被击中会停留在断点行。
1.7)其他gdb操作(s单步调试(逐语句:跳入自定义函数内部执行);n单步调试(逐过程,函数直接执行);bt等)
参考: https://www.cnblogs.com/guxuanqing/p/9093767.html
 
3、使用GDB时对源码路径重新设置
有的时候一个程序不是在同一个机器上执行的,当调试的时候就可能无法找到源代码的路径,这时就需要使用下面的方法了:
当gdb程序找不到源码时,进行重新设置源码路径步骤:
(1). 使用如下命令查看目标文件中保存的是相对路径还是绝对路径
readelf -p .debug_str target_bin_file
(2). 如果是相对路径:
使用 gdb 的dir命令添加的源码搜索路径
(3). 如果是绝对路径:
进行路径重新映射:set substitute-path old_path new_path
查看当前环境设置的调试目录:show directories
 
4、examine
examine(x)可以按照一定的格式打印内存地址处的数据,详细文档可参考这里。
(gdb) x/{COUNT}{FMT}{SIZE} {ADDRESS}
{COUNT}: 打印的数目,默认为1。
{FMT}: 打印的格式1,默认为上次使用的{FMT}:
o(octal): 8进制整数
x(hex): 16进制整数
d(decimal): 10进制整数
u(unsigned decimal): 10进制非负整数
t(binary): 2进制整数
f(float): 浮点数
a(address): 输出相对于前面最近的符号的偏移
i(instruction): 输出地址处的汇编指令
c(char): 字符
s(string): c字符串(null-terminated string)
z(hex, zero padded on the left): 见说明
{SIZE}: 打印的字节数目,默认为上次使用的{SIZE}:
b(byte): 1个字节
h(halfword): 2个字节
w(word): 4个字节
g(giant, 8 bytes): 8个字节
{ADDRESS}: 目标地址
 
几个例子:
(gdb) x/a 0x401419
0x401419 <main()+113>:  0x55c3c900000000b8
 
(gdb) x/i 0x40138d
=> 0x40138d <crash(int, double)+41>:    mov    -0x10(%rbp),%eax
 
(gdb) x/1fg 140737488346064
0x7fffffffdbd0: 10.125
 
5、GDB堆栈跟踪
程序“调用堆栈”是当前函数之前的所有已调用函数的列表(包括当前函数)。每个函数及其变量都被分配了一个“帧”,
最近调用的函数在 0 号帧中(“底部”帧)。要打印堆栈,发出命令 'bt'('backtrace' [回溯] 的缩写):
(gdb) bt
#0  0x80483ea in wib (no1=8, no2=8) at eg1.c:7
#1  0x8048435 in main (argc=1, argv=0xbffff9c4) at eg1.c:21
此结果显示了在 main() 的第 21 行中调用了函数 wib()(只要使用 'list 21' 就能证实这一点),而且 wib() 在 0 号帧中,
main() 在 1 号帧中。由于 wib() 在 0 号帧中,那么它就是执行程序时发生算术错误的函数。
实际上,发出 'info locals' 命令时,gdb 会打印出当前帧中的局部变量,缺省情况下,这个帧中的函数就是被中断的函数(0 号帧)。
可以使用命令 'frame' 打印当前帧。要查看 main 函数(在 1 号帧中)中的变量,可以发出 'frame 1' 切换到 1 号帧,
然后发出 'info locals' 命令:
(gdb) frame 1
#1  0x8048435 in main (argc=1, argv=0xbffff9c4) at eg1.c:21
21          result = wib(value, div);
(gdb) info locals
value = 8
div = 8
result = 4
i = 2
total = 6
此信息显示了在第三次执行 "for" 循环时(i 等于 2)发生了错误,此时 "value" 等于 "div"。
可以通过如上所示在 'frame' 命令中明确指定号码,或者使用 'up' 命令在堆栈中上移以及 'down' 命令在堆栈中下移来切换帧。
要获取有关帧的进一步信息,如它的地址和程序语言,可以使用命令 'info frame'。
 


6、线程相关的命令
一些调试多线程程序时常用的命令:
info threads: 查看线程列表
thread 2: 切换到2号线程,线程编号可由info threads得知
thread apply all bt: 打印所有线程的堆栈
 
————————————————
版权声明:本文为CSDN博主「byxdaz」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/byxdaz/article/details/106587615

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Mingw是一个Windows下常用的开发工具集,它包含一系列的编译器和工具,用于编译和构建C和C++程序。但是,在标准的Mingw安装中,并不包含gdb.exe调试器。 GDB是GNU项目下的调试器,用于帮助开发者在程序运行过程中定位和解决问题。然而,在Mingw中,并没有默认提供GDB。 为什么Mingw没有GDB呢?这是因为GDB是一个开源的调试器,主要用于GNU工具链,而Mingw主要是为Windows环境提供跨平台工具和编译器。虽然Mingw可以在Windows下编译和运行C和C++程序,但它并不是GNU工具链的一部分,因此没有默认包含GDB。 如果你希望在使用Mingw时使用GDB进行调试,你可以通过其他途径获得GDB。一种方法是下载一个独立的GDB安装包,并将其与Mingw一起使用。你可以从GDB的官方网站上下载适用于Windows的二进制文件,然后将GDB路径添加到系统的环境变量中。 另一个方法是使用MinGW-w64项目(MinGW的一个分支),这个项目提供了一个带有GDB的Mingw版本。通过使用MinGW-w64,你可以在安装Mingw时选择包含GDB,从而获得一个可以直接使用GDB进行调试的开发环境。 总之,虽然标准的Mingw安装中没有包含GDB.exe,但你仍然可以通过下载独立的GDB安装包或使用MinGW-w64来获取GDB,并与Mingw一起使用进行调试。 ### 回答2: Mingw是一套开发环境,用于在Windows操作系统上编译和运行C和C++程序。然而,Mingw默认不包含GNU调试器(GDB)的二进制文件gdb.exe。 GDB是一个强大的调试工具,可用于跟踪程序运行时的错误和异常。它允许开发人员在程序执行过程中查看变量的值、执行栈的状态以及执行流程。但是,尽管Mingw自带了GCC编译器,但它并没有集成GDB。 如果您想在Mingw中使用GDB进行调试,您可以进行以下两种选择: 1. 安装Mingw-w64:Mingw-w64是Mingw的一个分支,不仅包含GCC编译器,而且包含了GDB。您可以从官方网站上下载Mingw-w64并安装它,然后通过运行gdb命令来启动GDB调试器。 2. 单独安装GDB:您也可以单独下载GDB的二进制文件(例如mingw-w64项目提供的预编译二进制文件),然后将其与Mingw一起使用。您只需将GDB的二进制文件复制到Mingw安装目录的bin文件夹中,然后就可以通过运行gdb命令来启动GDB调试器了。 总结而言,尽管默认情况下,Mingw不包含GDB的二进制文件gdb.exe,但您可以选择安装Mingw-w64或单独安装GDB来在Mingw中使用GDB进行程序调试。 ### 回答3: Mingw是一个Windows上常用的开发工具包,提供了一套GNU编译器集合,可以在Windows平台上进行开发。但是,Mingw没有自带的GDB(GNU Debugger)调试器。 GDB是GNU项目中的一个调试工具,是开源的、功能强大的调试器。它允许开发者在程序运行过程中,检查程序的执行状态、调试代码并解决错误。但是,由于Mingw并未包含GDB在其默认安装中,因此在使用Mingw进行调试时,会无法找到gdb.exe。 在Mingw中,如果想要使用GDB进行调试,需要单独安装GDB,并将其与Mingw集成。可以从官方GNU的下载页面或者其他相关的开源渠道下载该程序。安装完成后,我们需要将gdb.exe的路径添加到系统的环境变量中,以便在命令行中直接使用。 请注意,由于不同版本的Mingw对于不同版本的GDB可能存在兼容性问题,因此在安装和配置时要确保选择合适的版本。另外,为了更方便地使用GDB进行调试,有些开发人员可能会选择使用其他IDE(集成开发环境),如Code::Blocks、CodeLite等,这些IDE可能会自带GDB或提供方便的GDB集成功能。 综上所述,虽然Mingw默认未包含gdb.exe,但我们可以单独安装GDB,并将其与Mingw集成,以便在Windows平台上进行程序的调试工作。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值