gdb调试步骤,gdb菜鸟教程

gdb入门简介gdb是GNU开源组织发布的强大的Linux上的程序调试工具。

一般来说,GDB主要有助于实现以下四个功能:

1、可以启动你的程序,按照你定制的要求随心所欲地运行程序。

2 .可以使调试后的程序在指定的调试点停止。 (断点可以是条件表达式。)

3、程序停止的时候,可以检查这个时候在你的程序里发生的事情。

4、可以修改程序,纠正一个错误的影响,测试其他错误。

gdb可调试对象gdb可调试语言Ada、Assembly、c、c、d、Fortran、Go、Objective-C、OpenCL、Modula-2、Pascal、Rust

可以在gdb中调试的文件类型注意在编译时必须添加-g选项。 可以使用gdb调试的文件类型有三种。

二进制文件。

gdb a.out

酷睿文件。 通常在发生错误时获取核心文件。 如果不存在,则可以使用ulimit -a命令检查core file siez是否为0,如果为0,则从ulimit -c unlimited更改为unlimited )。

gdb a.out core.12345

正在运行的进程。 [1234]时调试的进程编号

gdb -p 1234

gdb常规命令(入门)本节介绍入门级常规命令。 稍微高级一点的使用方法,会慢慢补充。

下面的索引表介绍了常用命令的基本含义。 将在下一节中详细介绍详细内容。

命令(缩写)语义help ) h )指令在恢复调试run (r )可执行文件runargv) argv)时,命令行被传递到start并被步骤执行,然后程序被执行可以看到第一个执行语句list(l (停在l上,源代码set的设置变量的值next ) n ) (与堆栈框架的层次关系,该堆栈框架跳进为每个进程调试的自定义函数内部,查看执行(braktrace ) Bt函数的调用) I ) I )查看函数内部局部变量的值的finish结束当前函数, 返回调用点continue(c )并继续执行(直到下一个断点或程序结束)打印值quit (q ) gdbbreak (b )断点设置禁用显示nable/disablle的断点deletenum(dnum ),删除第num个断点display,跟踪特定变量值undisplay,观察点上设置了观察变量watch的变量发生变化

在调试list line number (列出line number附近的代码list function )某个函数附近的源代码break gdb时使用break命令设置断点,缩写为b。 降低断点的方法有几种。

break function :在进入指定函数function时中断点。 在c中,可以使用class:function或function(type,type )格式指定函数名称

break filename:function :使用指定文件中的指定函数中断点

break linenumber :以指定的行数中断点

break filename:linenumber :在指定文件中的指定行数中断点

break /- offeset :在当前行之前或之后中断点

break *address :在程序正在运行的指定地址发出断点

break :通过以下命令停止运行

break . if condition :在处理特定循环体时,可以使用此方法进行调试。 其中…是上述break lineNumber、break /-offset的参数。 其中,condition表示条件,是条件成立的时间

按顺序停止。 例如,如果设置break if i=100,则程序在I为100时停止。

显示断点时,还可以使用info命令(如info breakpoints [n]和info break [n] )来显示断点信息。

可以使用delete命令删除所有断点

next使用next命令单步执行程序代码。 next的一步不进入函数内部。 与next对应的step命令在一个函数单步执行时进入函数内部。 与VC的step into相似。 其使用方法为下一步计数,一步跟踪。 如果有函数调用,就不能进入函数。 如果之后不加上count,则表示一个执行,加上count

继续—程序遇到断点并停止后,可以运行继续,直到下一个断点或程序结束。

print简称为p,可以使用print命令显示参数或程序执行数据

值得注意的是print输出可以指定显示变量的输出格式:

符号输出格式x十六进制d十进制u十六进制无符号数o八进制t二进制c字符格式f浮点数格式

print可以输出东西可多:全局变量,静态全局变量,局部变量,如果你的局部变量和全局变量发生冲突(也就是重名),一般情况下是局部变量会隐藏全局变量。

全局变量利用::,例如在1.c中看x:(gdb)p “1.c”::x

数组(动):p *array@len
array:数组的首地址,len:数据的长度

数组(静):直接p数组名

所有寄存器的值:info registers

查看指定的寄存器的值:p $eip

结构体。如果你想很漂亮的输出结构体请设置set print pretty on,打开print pretty这个东西,没错,输出很漂亮滴。

disassemble

用disassemble function来查看汇编代码,如下图示某个main函数的反汇编代码:

我们可以通过反汇编代码的偏移量来在汇编代码中打上断点,比如我们想要在图中红色箭头处打断点,只需b *main+45。

我们可以通过disassemble /m function指令,来将C/C++源代码和其反汇编一起显示,这样会更加直观:

backtrace

可以简写为bt,功能为显示函数的栈。

qcdmy的程序调用了一个函数,函数的地址,函数参数,函数内的局部变量都会被压入“栈”(Stack)中。你可以用这条命令来查看当前的栈中的所有信息。

在递归时可以很方便地查看栈上各个递归函数的栈帧:

图中的Delete函数会被递归调用,功能时删除二叉搜索树种的某个节点,具体功能不重要,这里是为了展示递归函数多层递归时通过backtrace来查看栈帧信息。

显示栈顶的几个层的信息:bt n

显示栈底下的几层信息:bt -n

但是,如果要查看某一层的信息,你需要在切换当前的栈,一般来说,程序停止时,最顶层的栈就是当前栈,如果你要查看栈下面层的详细信息,首先要做的是切换当前栈。这就要用到下面的frame命令。

frame

可以简写为f,n是一个从0开始的整数,是栈中的层编号。比如:frame 0,表示栈顶,即当前函数的栈帧,frame 1,表示栈的第二层,即调用当前函数的函数的栈帧。

up n:表示向栈的上面移动n层,可以不打n,表示向上移动一层。

down n:表示向栈的下面移动n层,可以不打n,表示向下移动一层。

info f:会打印出更为详细的当前栈层的信息。

layout

用于分割窗口,可以一边查看代码,一边测试。如下图是layout src的窗口展示:

命令及参数功能layout src显示源代码窗口layout asm显示汇编窗口layout regs显示源代码/汇编和寄存器窗口layout split显示源代码和汇编窗口layout next显示下一个layoutlayout prev显示上一个layout

另外我们可以通过一些功能键调整窗口选项:

Ctrl + L,刷新窗口
Ctrl + x,再按1:单窗口模式,显示一个窗口
Ctrl + x,再按2:双窗口模式,显示两个窗口
Ctrl + x,再按a:回到传统模式,即退出layout,回到执行layout之前的调试窗口。

Ref

https://www.gnu.org/software/gdb/

https://blog.csdn.net/awm_kar98/article/details/82840811

http://blog.chinaunix.net/uid-29611934-id-5168746.html

Published by

风君子

独自遨游何稽首 揭天掀地慰生平

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注