gdb单步调试(中)

合集下载

GDB调试简易教程

GDB调试简易教程

设置断点(break point)
`break ... if COND` 条件断点,当表达式COND非零时程序在断 点停止 例如`break 253 if i=10` `tbreak …` 设置一个只会停止一次的断点
设置观察点(watch point)
`watch EXPR` 为EXPR设置一个观察点,一旦EXPR被写入并发生变化,程 序停止 `rwatch EXPR` EXPR被读取时,程序停止 `awatch EXPR` EXPR被读取或者被写入时,程序停止 当程序运行到EXPR作用域以外的地方时,GDB将会自动删 除此观察点,如果想继续观察,必须重新设置观察点。
启动:
最通常的命令就是使用一个参数: $(m68k-linux-)gdb <可执行文档名> 你还可以同时为你的执行文件指定一个core文件: $gdb <可执行文件名> core 你也可以为你要执行的文件指定一个进程号:
$gdb <可执行文件名> <进程号>
常用启动参数:
-symbols <文件名>(-s <文件名>) 从<文件名>中读去符号 -x <文件名> 执行gdb命令,在<文件名>指定的文件中存放着一序列的gdb 命令,就象一个批处理 -directory(-d) <路径> 指定路径。把<路径>加入到搜索源文件的路径中
程序的恢复与单步调试

finish 运行程序,直到当前函数完成并返回,打印函数返回时的堆 栈地址和返回值及参数值等信息 until [location] 简写为u,继续运行程序直至跳出当前正在单步调试的循环体; 加参数表示继续运行到代码的location处或者当前stack frame返回

gdb调试汇编语言

gdb调试汇编语言

gdb调试汇编语言
GDB是一个功能强大的调试器,可以用来调试汇编语言程序。

在使用GDB调试汇编语言程序时,你需要首先确保程序已经被编译成可执行文件,并且包含了调试信息。

接下来,你可以通过以下步骤使用GDB来调试汇编语言程序:
1. 启动GDB,在命令行中输入`gdb`命令,然后在GDB提示符下输入可执行文件的名称。

2. 设置断点,你可以使用`break`命令在程序中设置断点,以便在特定的位置停止程序的执行。

例如,你可以输入`break main`来在程序的主函数处设置断点。

3. 运行程序,输入`run`命令来运行程序,程序会在设置的断点处停止执行。

4. 单步执行,使用`stepi`命令来逐条执行汇编指令,这样你可以逐步跟踪程序的执行过程。

5. 查看寄存器和内存,使用`info registers`命令可以查看寄
存器的值,而使用`x`命令可以查看内存中特定地址的内容。

6. 检查堆栈,使用`backtrace`命令可以查看当前的函数调用堆栈,而使用`frame`命令可以切换到不同的堆栈帧。

7. 观察变量,使用`print`命令可以查看特定变量的值,这对于检查程序状态非常有用。

8. 继续执行,当你想让程序继续执行时,可以使用`continue`命令来让程序一直执行到下一个断点或者程序结束。

以上是使用GDB调试汇编语言程序的基本步骤,当然,在实际调试过程中可能会有更复杂的情况需要处理,但是掌握了这些基本操作之后,你就可以更有效地使用GDB来调试汇编语言程序了。

希望这些信息对你有所帮助。

gdb 使用方法

gdb 使用方法

gdb 使用方法GDB是GNUDebugger的缩写,是一种强大的调试工具,可以用于C、C++、汇编等语言的程序调试。

在本文中,我们将介绍 GDB 的一些基本使用方法。

1. 编译程序在使用 GDB 调试程序之前,首先需要编译程序,以便在调试时能够获取程序的符号表信息。

在编译时,需要使用 -g 选项生成调试信息。

例如:```shell$ gcc -g -o my_program my_program.c```2. 启动 GDB启动 GDB 的方法很简单,只需要在命令行中输入 gdb 命令,后跟要调试的程序的名称。

例如:```shell$ gdb my_program```3. 设置断点在程序中设置断点可以帮助我们在程序执行到特定位置时停下来,方便我们进行调试。

在 GDB 中,可以使用 break 命令设置断点。

例如:```shell(gdb) break main```上面的命令会在程序执行到 main 函数时设置一个断点。

4. 运行程序在设置好断点之后,可以使用 run 命令运行程序。

例如:```shell(gdb) run```5. 调试程序程序运行过程中,可以使用 GDB 提供的一些命令进行调试。

例如:- step:单步执行程序,进入函数内部。

- next:单步执行程序,不进入函数内部。

- print:打印变量的值。

- watch:监视一个变量,当变量的值发生变化时停下来。

- continue:继续执行程序直到遇到下一个断点或程序结束。

6. 查看程序状态在调试程序时,可以使用 GDB 提供的一些命令查看程序的状态。

例如:- info breakpoints:查看当前设置的断点。

- info locals:查看当前函数的局部变量。

- info registers:查看当前 CPU 寄存器的值。

- info threads:查看当前程序中的线程信息。

7. 退出 GDB在调试完成后,可以使用 quit 命令退出 GDB。

gdb使用教程

gdb使用教程

gdb使用教程GDB是GNU调试器的缩写,是一个功能强大的命令行调试工具,用于帮助开发人员在调试过程中定位和修复程序中的错误。

以下是GDB的使用教程:1. 编译程序时添加调试信息:在使用GDB进行调试之前,需要确保程序在编译时包含了调试信息。

可以通过在编译命令中添加`-g`选项来实现。

例如:`gcc -g main.c -o main`。

2. 启动GDB:在命令行中输入`gdb`命令,然后输入可执行文件的路径作为参数。

例如:`gdb ./main`。

3. 设置断点:断点是在程序执行到指定位置时停下来的标记。

可以使用`break`命令来设置断点。

例如:`break main`可以在`main`函数的开头设置一个断点。

4. 开始执行程序:使用`run`命令来运行程序。

例如:`run`。

5. 执行程序并停在断点处:当程序开始运行后,会在达到断点处停下来等待输入。

此时可以使用一些GDB命令来检查程序的状态,如查看变量的值、栈帧等。

6. 单步执行:使用`next`命令来逐行执行程序。

例如:`next`。

7. 跳出函数:使用`finish`命令可以跳出当前正在执行的函数,并停在调用该函数的上一个函数中。

8. 继续执行:使用`continue`命令可以接着执行程序直到下一个断点或程序结束。

9. 查看变量的值:使用`print`或简写的`p`命令可以查看变量的值。

例如:`print i`可以查看变量`i`的值。

10. 修改变量的值:使用`set`命令可以修改变量的值。

例如:`set i = 10`可以将变量`i`的值修改为10。

11. 查看函数调用栈:使用`backtrace`或简写的`bt`命令可以查看函数调用栈。

12. 退出GDB:使用`quit`命令可以退出GDB。

以上是一些常用的GDB命令,使用GDB进行调试时还有很多其他的功能和命令可以使用,可以通过阅读GDB的文档来更详细地了解。

gdb调试命令的使用及总结

gdb调试命令的使用及总结

gdb调试命令的使用及总结GDB是GNU调试器的简称,是一个非常强大的调试工具,可用于调试C、C++等编程语言的程序。

通过GDB,开发人员可以在程序运行过程中查看变量的值、跟踪函数的执行、定位错误的原因等。

下面将介绍一些常用的GDB调试命令及其使用方法。

1. 启动GDB调试器:在命令行中输入"gdb"命令即可启动GDB调试器。

然后使用"gdb <可执行文件名>"命令加载要调试的可执行文件。

2. 设置断点:使用"break <行号>"命令在指定行号上设置断点。

可以使用"break <函数名>"命令在指定函数的入口处设置断点。

使用"info breakpoints"命令可以查看当前设置的断点。

3. 运行程序:使用"run"命令运行程序。

如果程序需要输入参数,则可以使用"run <参数1> <参数2> ..."的形式运行。

4. 单步执行:在断点处停下来后,可以使用"next"命令执行下一行代码。

使用"step"命令进入函数内部执行。

使用"finish"命令执行完当前函数并返回上一层调用。

5. 查看变量值:使用"print <变量名>"命令可以查看指定变量的值。

使用"display <变量名>"命令可以设置自动显示变量值。

6. 查看堆栈信息:使用"backtrace"命令可以查看函数调用的堆栈信息。

使用"frame <帧号>"命令可以切换到指定的堆栈帧。

7. 修改变量值:使用"set <变量名>=<新值>"命令可以修改指定变量的值。

(2021年整理)GDB调试命令手册.

(2021年整理)GDB调试命令手册.

(完整版)GDB调试命令手册.编辑整理:尊敬的读者朋友们:这里是精品文档编辑中心,本文档内容是由我和我的同事精心编辑整理后发布的,发布之前我们对文中内容进行仔细校对,但是难免会有疏漏的地方,但是任然希望((完整版)GDB调试命令手册.)的内容能够给您的工作和学习带来便利。

同时也真诚的希望收到您的建议和反馈,这将是我们进步的源泉,前进的动力。

本文可编辑可修改,如果觉得对您有帮助请收藏以便随时查阅,最后祝您生活愉快业绩进步,以下为(完整版)GDB调试命令手册.的全部内容。

(完整版)GDB调试命令手册.编辑整理:张嬗雒老师尊敬的读者朋友们:这里是精品文档编辑中心,本文档内容是由我和我的同事精心编辑整理后发布到文库,发布之前我们对文中内容进行仔细校对,但是难免会有疏漏的地方,但是我们任然希望 (完整版)GDB调试命令手册。

这篇文档能够给您的工作和学习带来便利。

同时我们也真诚的希望收到您的建议和反馈到下面的留言区,这将是我们进步的源泉,前进的动力。

本文可编辑可修改,如果觉得对您有帮助请下载收藏以便随时查阅,最后祝您生活愉快业绩进步,以下为〈(完整版)GDB调试命令手册。

> 这篇文档的全部内容。

常用的 gdb 命令backtrace 显示程序中的当前位置和表示如何到达当前位置的栈跟踪(同义词:where breakpoint 在程序中设置一个断点cd 改变当前工作目录clear 删除刚才停止处的断点commands 命中断点时,列出将要执行的命令continue 从断点开始继续执行delete 删除一个断点或监测点;也可与其他命令一起使用display 程序停止时显示变量和表达时down 下移栈帧,使得另一个函数成为当前函数frame 选择下一条 continue 命令的帧info 显示与该程序有关的各种信息jump 在源程序中的另一点开始运行kill 异常终止在 gdb 控制下运行的程序list 列出相应于正在执行的程序的原文件内容next 执行下一个源程序行,从而执行其整体中的一个函数print 显示变量或表达式的值pwd 显示当前工作目录pype 显示一个数据结构 (如一个结构或 C++类的内容quit 退出 gdbreverse-search 在源文件中反向搜索正规表达式run 执行该程序search 在源文件中搜索正规表达式set variable 给变量赋值signal 将一个信号发送到正在运行的进程step 执行下一个源程序行,必要时进入下一个函数undisplay display 命令的反命令,不要显示表达式until 结束当前循环up 上移栈帧,使另一函数成为当前函数watch 在程序中设置一个监测点(即数据断点whatis 显示变量或函数类型GDB 命令分类详解一:列文件清单。

GDB调试命令手册

GDB调试命令手册

常用的gdb命令backtrace 显示程序中的当前位置和表示如何到达当前位置的栈跟踪(同义词:where)breakpoint 在程序中设置一个断点cd 改变当前工作目录clear 删除刚才停止处的断点commands 命中断点时,列出将要执行的命令continue 从断点开始继续执行delete 删除一个断点或监测点;也可与其他命令一起使用display 程序停止时显示变量和表达时down 下移栈帧,使得另一个函数成为当前函数frame 选择下一条continue命令的帧info 显示与该程序有关的各种信息jump 在源程序中的另一点开始运行kill 异常终止在gdb 控制下运行的程序list 列出相应于正在执行的程序的原文件内容next 执行下一个源程序行,从而执行其整体中的一个函数print 显示变量或表达式的值pwd 显示当前工作目录pype 显示一个数据结构(如一个结构或C++类)的内容quit 退出gdbreverse-search 在源文件中反向搜索正规表达式run 执行该程序search 在源文件中搜索正规表达式set variable 给变量赋值signal 将一个信号发送到正在运行的进程step 执行下一个源程序行,必要时进入下一个函数undisplay display命令的反命令,不要显示表达式until 结束当前循环up 上移栈帧,使另一函数成为当前函数watch 在程序中设置一个监测点(即数据断点)whatis 显示变量或函数类型GDB命令分类详解一:列文件清单 (2)二:执行程序 (2)三:显示数据 (2)四:断点(breakpoint) (3)五.断点的管理 (3)六.变量的检查和赋值 (4)七.单步执行 (4)八.函数的调用 (4)九.机器语言工具 (4)十.信号 (4)十一.原文件的搜索 (5)十二. UNIX接口 (5)十三. 命令的历史 (5)十四. GDB帮助 (5)十五. GDB多线程 (6)十六. GDB使用范例 (7)一:列文件清单1.List(gdb) list line1,line2二:执行程序要想运行准备调试的程序,可使用run命令,在它后面可以跟随发给该程序的任何参数,包括标准输入和标准输出说明符(<和>)和外壳通配符(*、?、[、])在内。

gdb 调试原理

gdb 调试原理

gdb 调试原理GDB(GNU Debugger)是一个强大的Unix/Linux下的源代码调试工具。

它允许开发者在程序运行时检查其内部状态,例如变量的值、堆栈跟踪、内存内容等。

GDB通过以下原理进行调试:1. **断点(Breakpoints)**:断点是GDB中一个重要的概念,它允许程序在特定点暂停执行。

开发者可以在代码的关键部分设置断点,当程序运行到这些点时,GDB会自动暂停,允许开发者检查程序状态。

2. **监视点(Watchpoints)**:除了断点,GDB还允许设置监视点。

监视点会监视变量的值变化,当变量的值发生变化时,GDB会暂停程序。

这对于观察程序中某些变量的动态变化非常有用。

3. **单步执行(Single-stepping)**:GDB允许开发者逐行或逐指令执行程序。

这样可以在每一步查看程序的执行情况和变量状态,帮助开发者找出程序的错误位置。

4. **查看堆栈跟踪(Stack Traces)**:当程序出现错误或异常时,GDB可以显示当前的堆栈跟踪,即函数调用序列。

这有助于确定错误发生的上下文和位置。

5. **表达式求值(Expression Evaluation)**:在GDB中,开发者可以求值任何C/C++表达式,并查看结果。

这对于检查变量、调用函数或进行其他动态分析非常有用。

6. **源码和汇编混合调试**:GDB允许开发者在源代码和汇编代码之间自由切换,以便从不同角度理解程序的执行过程。

7. **线程调试**:对于多线程程序,GDB提供了线程相关的调试功能,例如选择特定的线程进行调试、查看线程的状态等。

8. **环境变量和命令行参数**:GDB允许开发者设置环境变量和命令行参数,这可以用来改变程序的运行环境或设置特定的调试参数。

GDB的工作原理是基于“调试器协议”的,这个协议定义了GDB和目标程序之间的通信方式。

当GDB与目标程序连接后,它发送各种命令给目标程序,目标程序响应这些命令并返回结果给GDB。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

一、设置断点(BreakPoint )我们用break 命令来设置断点。

正面有几点设置断点的方法:break <function>在进入指定函数时停住。

C++ 中可以使用class::function 或function(type,type) 格式来指定函数名。

break <linenum>在指定行号停住。

break +offsetbreak -offset在当前行号的前面或后面的offset 行停住。

offiset 为自然数。

break filename:linenum在源文件filename 的linenum 行处停住。

break filename:function在源文件filename 的function 函数的入口处停住。

break *address在程序运行的内存地址处停住。

breakbreak 命令没有参数时,表示在下一条指令处停住。

break ... if <condition>... 可以是上述的参数,condition 表示条件,在条件成立时停住。

比如在循环境体中,可以设置break if i=100 ,表示当i 为100 时停住程序。

查看断点时,可使用info 命令,如下所示:(注:n 表示断点号)info breakpoints [n]info break [n]二、设置观察点(WatchPoint )观察点一般来观察某个表达式(变量也是一种表达式)的值是否有变化了,如果有变化,马上停住程序。

我们有下面的几种方法来设置观察点:watch <expr>为表达式(变量)expr 设置一个观察点。

一量表达式值有变化时,马上停住程序。

rwatch <expr>当表达式(变量)expr 被读时,停住程序。

awatch <expr>当表达式(变量)的值被读或被写时,停住程序。

info watchpoints列出当前所设置了的所有观察点。

三、设置捕捉点(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>只设置一次捕捉点,当程序停住以后,应点被自动删除。

四、维护停止点上面说了如何设置程序的停止点,GDB 中的停止点也就是上述的三类。

在GDB 中,如果你觉得已定义好的停止点没有用了,你可以使用delete 、clear 、disable 、enable 这几个命令来进行维护。

clear清除所有的已定义的停止点。

clear <function>clear <filename:function>清除所有设置在函数上的停止点。

clear <linenum>clear <filename:linenum>清除所有设置在指定行上的停止点。

delete [breakpoints] [range...]删除指定的断点,breakpoints 为断点号。

如果不指定断点号,则表示删除所有的断点。

range 表示断点号的范围(如:3-7 )。

其简写命令为 d 。

比删除更好的一种方法是disable 停止点,disable 了的停止点,GDB 不会删除,当你还需要时,enable 即可,就好像回收站一样。

disable [breakpoints] [range...]disable 所指定的停止点,breakpoints 为停止点号。

如果什么都不指定,表示disable 所有的停止点。

简写命令是dis.enable [breakpoints] [range...]enable 所指定的停止点,breakpoints 为停止点号。

enable [breakpoints] once range...enable 所指定的停止点一次,当程序停止后,该停止点马上被GDB 自动disable 。

enable [breakpoints] delete range...enable 所指定的停止点一次,当程序停止后,该停止点马上被GDB 自动删除。

五、停止条件维护前面在说到设置断点时,我们提到过可以设置一个条件,当条件成立时,程序自动停止,这是一个非常强大的功能,这里,我想专门说说这个条件的相关维护命令。

一般来说,为断点设置一个条件,我们使用if 关键词,后面跟其断点条件。

并且,条件设置好后,我们可以用condition 命令来修改断点的条件。

(只有break 和watch 命令支持if ,catch 目前暂不支持if )condition <bnum> <expression>修改断点号为bnum 的停止条件为expression 。

condition <bnum>清除断点号为bnum 的停止条件。

还有一个比较特殊的维护命令ignore ,你可以指定程序运行时,忽略停止条件几次。

ignore <bnum> <count>表示忽略断点号为bnum 的停止条件count 次。

六、为停止点设定运行命令我们可以使用GDB 提供的command 命令来设置停止点的运行命令。

也就是说,当运行的程序在被停止住时,我们可以让其自动运行一些别的命令,这很有利行自动化调试。

对基于GDB 的自动化调试是一个强大的支持。

commands [bnum]... command-list ...end为断点号bnum 指写一个命令列表。

当程序被该断点停住时,gdb 会依次运行命令列表中的命令。

例如:break foo if x>0commandsprintf "x is %d\n",xcontinueend断点设置在函数foo 中,断点条件是x>0 ,如果程序被断住后,也就是,一旦x 的值在foo 函数中大于0 ,GDB 会自动打印出x 的值,并继续运行程序。

如果你要清除断点上的命令序列,那么只要简单的执行一下commands 命令,并直接在打个end 就行了。

七、断点菜单在C++ 中,可能会重复出现同一个名字的函数若干次(函数重载),在这种情况下,break <function> 不能告诉GDB 要停在哪个函数的入口。

当然,你可以使用break <function(type)> 也就是把函数的参数类型告诉GDB ,以指定一个函数。

否则的话,GDB 会给你列出一个断点菜单供你选择你所需要的断点。

你只要输入你菜单列表中的编号就可以了。

如:(gdb) b String::after[0] cancel[1] all[2] file:; line number:867[3] file:; line number:860[4] file:; line number:875[5] file:; line number:853[6] file:; line number:846[7] file:; line number:735> 2 4 6Breakpoint 1 at 0xb26c: file , line 867.Breakpoint 2 at 0xb344: file , line 875.Breakpoint 3 at 0xafcc: file , line 846.Multiple breakpoints were set.Use the "delete" command to delete unwantedbreakpoints.(gdb)可见,GDB 列出了所有after 的重载函数,你可以选一下列表编号就行了。

0 表示放弃设置断点,1 表示所有函数都设置断点。

八、恢复程序运行和单步调试当程序被停住了,你可以用continue 命令恢复程序的运行直到程序结束,或下一个断点到来。

也可以使用step 或next 命令单步跟踪程序。

continue [ignore-count]c [ignore-count]fg [ignore-count]恢复程序运行,直到程序结束,或是下一个断点到来。

ignore-count 表示忽略其后的断点次数。

continue ,c ,fg 三个命令都是一样的意思。

step <count>单步跟踪,如果有函数调用,他会进入该函数。

进入函数的前提是,此函数被编译有debug 信息。

很像VC 等工具中的step in 。

后面可以加count 也可以不加,不加表示一条条地执行,加表示执行后面的count 条指令,然后再停住。

next <count>同样单步跟踪,如果有函数调用,他不会进入该函数。

很像VC 等工具中的step over 。

后面可以加count 也可以不加,不加表示一条条地执行,加表示执行后面的count 条指令,然后再停住。

set step-modeset step-mode on打开step-mode 模式,于是,在进行单步跟踪时,程序不会因为没有debug 信息而不停住。

这个参数有很利于查看机器码。

set step-mod off关闭step-mode 模式。

finish运行程序,直到当前函数完成返回。

并打印函数返回时的堆栈地址和返回值及参数值等信息。

当你厌倦了在一个循环体内单步跟踪时,这个命令可以运行程序直到退出循环体。

stepi 或sinexti 或ni单步跟踪一条机器指令!一条程序代码有可能由数条机器指令完成,stepi 和nexti 可以单步执行机器指令。

与之一样有相同功能的命令是“ display/i $pc ” ,当运行完这个命令后,单步跟踪会在打出程序代码的同时打出机器指令(也就是汇编代码)九、信号(Signals )信号是一种软中断,是一种处理异步事件的方法。

相关文档
最新文档