GDB基本使用方法
- 格式:docx
- 大小:17.22 KB
- 文档页数:3
gdb查找函数
GDB是一款非常强大的调试器,通过GDB我们可以对程序进行调试,调试的过程中,我们有时候需要查找某个函数的定义和调用情况,本文将介绍如何在GDB中查找函数的方法。
1.使用“info functions”命令
GDB中提供了一个“info functions”命令,可以列出程序中的所有函数,使用方法如下:
(gdb) info functions
该命令将输出所有函数的名称、返回类型、参数列表等信息,我们可以通过该命令查找到需要调试的函数并获取其名称。
2.使用“break”命令
在GDB中使用“break”命令可以在程序中设置断点,当程序执行到该断点时,程序会暂停执行,我们可以在此处查看函数的执行情况,使用方法如下:
(gdb) break function_name
其中function_name为需要调试的函数名称。
3.使用“backtrace”命令
使用“backtrace”命令可以查看函数的调用栈,即该函数被调用的位置和调用该函数的函数名称等信息,使用方法如下:
(gdb) backtrace
该命令将输出当前函数的调用栈,我们可以通过该命令查看函数的调用情况。
4.使用“search”命令
如果我们不知道函数的名称,只知道函数的一部分内容,可以使用“search”命令在程序中查找包含该内容的函数,使用方法如下: (gdb) search keyword
其中keyword为需要查找的关键字。
总结
通过以上方法,我们可以在GDB中查找函数的定义和调用情况,这对于程序调试和错误排查非常有帮助。
值得注意的是,以上方法只是GDB查找函数的几种基本方法,GDB还提供了许多其他的调试命令,可以根据需要选择使用。
gdb传入参数GDB是一款用于程序调试的工具,它可以帮助程序员定位和修复代码中的错误。
在使用GDB进行调试的过程中,我们需要传入一些参数来帮助GDB定位问题。
本文将介绍GDB传入参数的相关知识。
一、GDB的基本用法GDB能够对可执行文件进行调试,我们首先需要编译出可执行文件。
在编译时,我们需要加上-g选项以生成调试信息。
编译命令如下:$ gcc -g -o demo demo.c其中,-g选项用于生成调试信息,-o选项用于指定生成的可执行文件的名称,demo.c是源代码文件的名称。
执行可执行文件时,需要加上-gdb选项来告诉GDB需要对该程序进行调试,如下所示:$ gdb ./demo执行以上命令后,GDB就会启动。
此时我们可以使用GDB的各种命令来对程序进行调试。
二、GDB传入参数在使用GDB进行调试时,我们经常需要传入一些参数来辅助调试。
GDB支持多种方式传入参数。
1.在启动GDB时传入参数我们可以在启动GDB时传入参数,例如:$ gdb ./demo arg1 arg2其中,arg1、arg2表示程序执行时需要用到的参数。
2.在GDB中传入参数我们也可以在GDB中传入参数。
在GDB中,使用set命令可以设置参数,例如:$ set args arg1 arg2此时GDB就会设置好参数,等待我们进一步的调试命令。
3.在GDB中重新设置参数在GDB中,我们可以在任何时候使用set命令重新设置参数,例如:$ set args arg1 arg2 arg3此时GDB会将参数重新设置为arg1、arg2、arg3。
4.查看参数在GDB中,使用show命令可以查看当前设置的参数,例如:$ show args此时GDB会显示当前设置的参数。
5.删除参数在GDB中,使用unset命令可以删除参数,例如:$ unset args此时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来调试汇编语言程序了。
希望这些信息对你有所帮助。
gdbfinish的用法gdb是一个强大的调试器,可以帮助开发者定位和修复程序中的错误。
其中一个常用的gdb命令是`finish`,它用于一次性执行程序,直到当前函数执行完毕,然后返回到调用该函数的地方继续执行。
`finish`命令在调试一个程序时非常有用,特别是当你想跳过当前函数的调试,而直接返回到调用该函数的地方时。
当我们进入调试模式时,通过`start`命令可以开始执行程序并停在`main`函数的第一行。
然后,我们可以使用`step`命令逐行执行程序,或者使用`next`命令跳过函数调用。
但是,如果我们想要跳过当前函数调用的所有行和子函数调用,这时候就可以使用`finish`命令。
`finish`命令的语法为:```finish```使用`finish`命令后,gdb会计算当前调用栈的帧数,然后执行程序直到当前函数执行完毕。
当函数执行完毕后,gdb会自动返回到调用该函数的地方,然后程序会继续按照正常的流程继续执行。
以下是一些关于`finish`命令的注意事项和使用场景:1. 当函数内有嵌套函数时,`finish`命令将不会跳过嵌套函数调用,而是在当前函数内所有嵌套函数返回后才会继续执行。
2. 在使用`finish`命令之前,建议在对应的函数内设置断点,以确保函数中的错误被发现和修复。
3. 使用`finish`命令时,gdb会跳过当前函数和子函数内的所有代码,并且不会停在任何断点处。
如果需要在其他地方暂停程序,可以在相应位置设置断点,并使用`continue`命令让程序继续执行。
4. 如果在调试过程中想重新执行一次进入函数的操作,可以使用`return`命令,它能够在不影响当前函数状态和程序运行的情况下,重新执行函数。
5. `finish`命令的作用范围限制在当前调用栈帧内。
如果正在调试的程序中存在多个线程,`finish`命令只会针对当前线程的调用栈进行操作。
以下是一个具体的例子来演示如何使用`finish`命令:```c++#include <iostream>int inner_function(int x)return x + 1;int outer_function(int x)int result = inner_function(x);std::cout << "The result is: " << result << std::endl;return result;int maiint num = 5;int result = outer_function(num);std::cout << "The final result is: " << result << std::endl;return 0;```假设我们想要调试`outer_function`,但是不关心`inner_function`的执行过程。
gdb 调试函数
要调试一个函数,你需要以下步骤:1. 使用`gdb` 命令行工具启动你的程序:`gdb <executable>`,其中`<executable>` 是你要调试的可执行文件。
2. 设置断点:使用`break` 命令在你要调试的函数的位置设置断点。
例如,如果你要调试的函数是`my_function()`,可以使用`break my_function` 来设置断点。
3. 启动程序:使用`run` 命令启动程序,然后程序将在断点处停止执行。
4. 执行程序:使用`next` 命令按行执行代码,或使用`step` 命令进入函数内部执行。
5. 在调试过程中查看变量的值:使用`print` 命令来查看变量的值。
例如,可以使用`print variable_name` 来查看变量`variable_name` 的值。
6. 继续执行程序:使用`continue` 命令继续执行程序,直到下一个断点或程序结束。
7. 在调试结束后退出`gdb`:使用`quit` 命令退出`gdb`。
这些是基本的
`gdb` 调试函数的使用方法。
你还可以使用其他命令来查看堆栈信息、设置条件断点、跳到指定行等。
可以使用`help` 命令来获取更多有关`gdb` 命令的信息。
gdb tui用法-回复GDB是一个功能强大的调试器,用于分析和跟踪程序的执行过程。
GDB 提供了许多调试工具和功能,其中之一就是TUI(Text User Interface)用户界面。
TUI界面可以在命令行界面上提供一个基于文本的可视化调试环境,使得调试更加直观和方便。
本文将逐步介绍GDB TUI的使用方法,帮助读者更好地理解和利用这一功能。
首先,为了使用GDB TUI界面,我们需要确保已经安装了GDB调试器。
GDB是多平台支持的,可以在各种操作系统上使用。
可以通过在命令行中输入`gdb`来启动GDB。
一旦进入GDB调试器环境,我们可以启用TUI界面。
最简单的方法是在启动GDB时使用`gdb -tui`命令。
这将直接进入GDB TUI界面,并同时打开两个窗口:源代码窗口和汇编代码/寄存器窗口。
源代码窗口显示了当前正在调试的源代码文件,并将当前执行的行突出显示。
汇编代码/寄存器窗口显示了当前正在执行的机器代码以及与之相关的寄存器状态。
现在,我们可以使用GDB的各种调试命令来分析和跟踪程序的执行过程。
以下是一些常用的命令:1. `run`:启动程序的执行。
如果程序没有参数,直接输入`run`即可。
如果程序有命令行参数,可以使用`run <args>`来传递参数。
2. `break`:设置断点。
可以使用`break <function>`来在特定函数中设置断点,或者使用`break <line>`来在特定行上设置断点。
3. `step`:逐行执行程序。
通过使用`step`命令,我们可以跳转到下一行并停止执行,这样可以逐行检查代码并分析程序的执行流程。
可以使用`step <count>`一次性执行多行,并直接停在下一行。
4. `next`:单步执行程序。
与`step`命令不同,`next`命令可以跳过函数调用,只执行当前行,并直接跳转到下一行。
5. `continue`:继续执行程序。
gdb debug插件用法
在GNU调试器(GDB)中,调试插件是用于增强调试功能的扩展。
GDB可以通过使用插件来提供更多的功能,例如支持特定的编程语言、硬件架构或者提供额外的调试工具。
GDB调试器支持多种插件,这些插件具有不同的功能和用途。
以下是一些常见的GDB调试插件以及它们的用途:
Python插件:允许在GDB中使用Python脚本进行调试。
可以通过Python 脚本编写自定义的调试命令和脚本,以实现更复杂的调试操作。
Reverse Debugging插件:提供反向调试功能,允许按照程序的反向执行来进行调试,有助于查找问题。
Pretty Printing插件:用于美化打印输出,特别是对于复杂的数据结构,比如C++中的STL容器。
它可以改善输出的可读性。
硬件特定插件:针对特定的硬件架构或设备,提供额外的调试支持。
通常情况下,要使用GDB的插件功能,你需要先了解你想要使用的插件是否可用,并在GDB中加载它们。
具体的加载方式取决于所使用的插件类型和GDB 的版本。
例如,加载Python插件可以通过以下步骤完成:确保GDB编译时启用了Python支持。
在GDB中使用python命令加载Python插件,例如:(gdb)python import gdb 这样就可以使用Python脚本进行自定义的调试操作了。
对于特定的调试插件,最好查阅GDB的官方文档以获取详细的加载和使用方法,不同的插件可能有不同的配置和加载方式。
gdbserver用法使用gdbserver进行调试的常见步骤如下:1. 在目标设备上启动gdbserver:通过命令行启动gdbserver,并指定绑定的IP和端口,例如:```$ gdbserver <ip:port> <e某ecutable>```这将在目标设备上开启一个gdbserver进程,并监听来自指定IP和端口的连接请求。
2.在主机上运行GDB:在主机上打开终端,使用GDB命令行工具连接到目标设备,例如:```$ gdb <e某ecutable>```3. 在GDB中设置连接到gdbserver:在GDB命令行中输入以下命令来连接到正在运行的gdbserver进程:```(gdb) target remote <ip:port>```4.设置断点和调试:一旦连接建立,您可以在GDB中设置断点,观察变量和执行程序。
例如:```(gdb) break <function_name>(gdb) run(gdb) print <variable_name>(gdb) step```5.分析和调试:使用GDB的各种命令和调试功能,如单步执行(step)、步入函数(step into)、跳出函数(step out)、打印变量(print)、查看栈帧(backtrace)等,对目标程序进行分析和调试。
此外,GDB还提供了一些附加功能来支持使用gdbserver进行远程调试,例如:- 多目标调试:允许同时调试多个目标设备或进程,只需在GDB中连接到不同的gdbserver实例即可。
- 远程文件传输:可以使用GDB的`file`命令来传输目标设备上的可执行文件和调试信息文件到主机上,方便在本地进行调试。
需要注意的是,使用gdbserver进行远程调试可能需要目标设备和主机之间的网络连接,同时也需要确保主机和目标设备上的可执行文件和调试符号文件的兼容性。
GDB中文手册/****************************************************/GDB 用调试程序GDB 2概述GDB 5使用GDB UNIX shell 8中运行的程序GDB 8在中运行程序 9调试已运行的程序两种方法: / 9暂停恢复程序运行BreakPoint 9一、设置断点()WatchPoint 10二、设置观察点()CatchPoint 10三、设置捕捉点() 11四、维护停止点 12五、停止条件维护 12六、为停止点设定运行命令 13七、断点菜单 13八、恢复程序运行和单步调试Signals 14九、信号()Thread Stops 15十、线程() 16查看栈信息 18查看源程序 18一、显示源代码 19二、搜索源代码 19三、指定源文件的路径 20四、源代码的内存 21查看运行时数据 21一、表达式 21二、程序变量 22三、数组 23四、输出格式 23五、查看内存 24六、自动显示 25七、设置显示选项GDB 25中关于显示的选项比较多,这里我只例举大多数常用的选项。
27八、历史记录GDB 28九、环境变量 28十、查看寄存器 29改变程序的执行 29一、修改变量值 29二、跳转执行 30三、产生信号量 30四、强制函数返回 30五、强制调用函数GDB 31在不同语言中使用 32后记 1 第页GDB概述是开源组织发布的一个强大的下的程序调试工具。
或许,各位比较喜欢那种GDB GNU UNIX图形界面方式的,像、等的调试,但如果你是在平台下做软件,你会发现VC BCB IDE UNIX这个调试工具有比、的图形化调试器更强大的功能。
所谓寸有所长,尺有所短GDB VC BCB“”就是这个道理。
一般来说,主要帮忙你完成下面四个方面的功能:GDB1、启动你的程序,可以按照你的自定义的要求随心所欲的运行程序。
2、可让被调试的程序在你所指定的调置的断点处停住。
北京林业大学2012学年—2013学年第二学期 Linux应用实验任务书专业名称:信息管理与信息系统班级:姓名:学号:实验题目:实验四 gcc和gdb的基本使用实验环境: Red Hat Linux 9 实验目的:通过调试一个有问题的程序,进一步熟练使用Vi 操作,而且熟练掌握Gcc 编译及Gdb 的调试命令,通过对有问题程序的跟踪调试,进一步提高发现问题和解决问题的能力。
实验内容:Gdb调试题目:(1)使用Vi 编辑器,将以下代码输入到名为greet.c 的文件中。
此代码的原意为输出倒序main函数中定义的字符串,但结果显示没有输出。
代码如下所示:(2)使用Gcc 编译这段代码。
(3)运行生成的可执行文件,观察运行结果。
(4)使用Gdb 调试程序,通过设置断点、单步跟踪,一步步找出错误所在。
(5)纠正错误,更改源程序并得到正确的结果。
实验步骤:(1)在工作目录上新建文件greet.c,并用Vi 启动:vi greet.c。
(2)在Vi 中输入以上代码。
(3)在Vi 中保存并退出:wq。
(4)用Gcc 编译:(5)运行greet:./greet,输出为:可见,该程序没有能够倒序输出(6)启动Gdb 调试:(7)查看源代码并进行调试。
使用list查看源代码:将原来有错的程序经过Gdb调试,找出问题所在,并修改源代码,输出正确的倒序显示字符串的结果。
实验步骤中请适当截图。
GNU调试器是一个功能非常强大的工具。
要了解更加详尽的知识,建议阅读GNU调试器手册。
在执行完for循环后设置一个断点,以便查看是否在赋值时出了问题设置完断点后运行,到断点设置处停止:发现的问题:查看赋值后string2中的数据,发现string2【0】被赋值了字符串的结尾标志“\0”,因此,在后面执行printf 输出时,由于第一个字符就是结束标志,因此,不会输出后面倒序的字符串,而产生上述结果:删除所有断点后,改正源代码,运行:代码改正:将每个元素向前移一位,将原来string2【0】中的‘\0’放到最后即可。
gdb条件断点的使用在软件开发过程中,我们经常需要调试程序来解决bug。
GDB(GNU调试器)是一个强大的调试工具,它提供了许多功能来帮助程序员快速定位和修复问题。
其中一个非常有用的功能是条件断点。
条件断点允许我们在程序执行到指定代码位置时,只在满足特定条件时才中断程序的执行。
这样可以帮助我们针对特定情况进行调试,提高调试效率。
在GDB中,我们可以使用条件断点来实现这一功能。
下面是使用GDB条件断点的几个步骤:1. 启动GDB并加载待调试的可执行文件:```bashgdb <可执行文件路径>```2. 在需要设置条件断点的代码行上下文中,使用GDB命令`break`或其简写形式`b`来设置断点:```bashbreak <文件名>:<行号>```例如,要在`main.c`文件的第10行设置断点,可以使用以下命令:```bashb main.c:10```3. 设置条件断点:```bashcondition <断点编号> <条件>```其中,`<断点编号>`是通过`info breakpoints`命令获取的断点编号,`<条件>`是一个表达式,用于描述条件。
条件可以使用程序中的变量或常量,以及逻辑运算符和关系运算符。
例如,要在断点编号为1的位置设置条件断点,当变量`count`等于5时中断程序的执行,可以使用以下命令:```bashcondition 1 count == 5```4. 执行程序并触发特定条件:```bashrun```程序将开始运行,直到达到设置的条件断点或程序结束。
当条件被满足时,程序会停在断点处等待进一步的操作。
5. 调试停在断点处的程序:在程序停在断点处时,可以使用GDB的其他命令来观察和修改程序状态。
例如,可以使用`print`命令查看变量的值,或者使用`step`命令逐行执行程序。
6. 继续程序执行或重新启动:```bashcontinue```使用`continue`命令可以继续执行程序,直到下一个断点或程序结束。
Linux中包含有一个很有用的调试工具--gdb(GNU Debuger),它可以用来调试C和C++程序,功能不亚于Windows下的许多图形界面的调试工具。
和所有常用的调试工具一样,gdb提供了以下功能:# 监视程序中变量的值# 在程序中设置断点# 程序的单步执行在使用gdb前,必须先载入可执行文件,因为要进行调试,文件中就必须包含调试信息,所以在用gcc或cc编译时就需要用-g参数来打开程序的调试选项。
调试开始时,必须先载入要进行调试的程序,可以用以下两种方式:* 在启动gdb后执行以下命令:file 可执行文件路径* 在gdb启动时就载入程序:gdb 可执行文件路径载入程序后,接下来就是要进行断点的设置,要监视的变量的添加等工作,下面对在这个过程中常会用到的命令逐一进行介绍:* list:显示程序中的代码,常用使用格式有:list输出从上次调用list命令开始往后的10行程序代码。
list -输出从上次调用list命令开始往前的10行程序代码。
list n输出第n行附近的10行程序代码。
list function输出函数function前后的10行程序代码。
* forward/search:从当前行向后查找匹配某个字符串的程序行。
使用格式:forward/search 字符串查找到的行号将保存在$_变量中,可以用print $_命令来查看。
* reverse-search:和forward/search相反,向前查找字符串。
使用格式同上。
* break:在程序中设置断点,当程序运行到指定行上时,会暂停执行。
使用格式:break 要设置断点的行号* tbreak:设置临时断点,在设置之后只起作用一次。
使用格式:tbreak 要设置临时断点的行号* clear:和break相反,clear用于清除断点。
使用格式:clear 要清除的断点所在的行号* run:启动程序,在run后面带上参数可以传递给正在调试的程序。
苏州哥伦GDB3000-7使用说明书
1、设置:编程健,一级菜单进入或退出。
2、确认:确定键,逐级进入菜单画面、设定参数确认。
3、向上箭头:UP递增键,数据或功能码的递增。
4、向上箭头:DoWN递减键,数据或功能码的递减。
5、向左箭头:左移位键,在停机显示界面和运行显示界面下,可左移循环选择显示参数;在修改参数时,可以选择参数的修改位。
6、运行:运行键,在键盘操作方式下,用于运行操作。
7、停止、复位:停止、复位键,运行状态时,按此键可用于停止运行操作;受功能码P7.04制复位键制约。
故障报警状态时,所有控制模式都可用该键来复位操作。
8、正反转、点动:多功能键,用于正转、反转与点动。
1.概论我们将学习使用gdb来调试通过一个通过串行线同PC相连的嵌入式系统.Gdb可以调试各种程序,包括C、C++、JA V A、PASCAL、FORAN和一些其它的语言。
包括GNU所支持的所有微处理器的汇编语言。
在gdb的所有可圈可点的特性中,有一点值得注意,就是当运行gdb的平台(宿主机)通过串行端口(或网络连接,或是其他别的方式)连接到目标板时(应用程序在板上运行),gdb 可以调试对应用程序进行调试。
这个特性不光在将GNU工具移植到一个新的操作系统或微处理器时侯很有用,对于那些使用GNU已经支持的芯片的嵌入式系统进行开发的设计人员来讲,也是非常有用的。
当gdb被适当的集成到某个嵌入式系统中的时候,它的远程调试功能允许设计人员一步一步的调试程序代码、设置断点、检验内存,并且同目标交换信息。
Gdb同目标板交换信息的能力相当强,胜过绝大多数的商业调试内核,甚至功能相当于某些低端仿真器。
2. Gdb在嵌入式领域的功能实现当调试一个远端目标设备时,gdb依靠了一个调试stub来完成其功能。
调试stub 即是嵌入式系统中一小段代码,它提供了运行gdb的宿主机和所调试的应用程序间的一个媒介。
Gdb和调试stub通过GDB串行协议进行通信。
GDB串行协议是一种基于消息的ASCII码协议,包含了诸如读写内存、查询寄存器、运行程序等命令。
由于绝大多数嵌入式系统设计人员为了最好的利用他们手中特定的硬件的特征,总是自己编写自己的stub。
所以我们有必要清楚的了解一下gdb的串行通信协议。
在后面我们会详细介绍。
为了设置断点,gdb使用内存读写命令,来无损害地将原指令用一个TRAP命令或其它类似的操作码(在此假定,被调试的应用程序是处在RAM中的,当然,如果stub 有足够好的性能,硬件也不错的话,这个条件也不是必须的)代替,使得执行该命令时,可以使得控制权转移到调试stub手中去。
在此时,调试stub的任务就是将当前场景传送给gdb (通过远程串行通信协议),然后从gdb处接收命令,该命令告诉了stub下一步该做什么。
GDB(GNU调试器)是一种功能强大的调试工具,广泛用于C、C++和其他编程语言的调试中。
在调试过程中,我们常常需要设置断点来帮助我们定位程序中的问题。
在GDB中,除了普通的断点外,我们还可以设置条件断点。
本文将详细介绍GDB中的条件断点的使用方法。
1. 什么是条件断点条件断点是一种特殊的断点,它只在满足特定条件时才会触发。
在程序执行过程中,当满足设置的条件时,程序会在该处停下来,方便我们进行调试分析。
条件断点的设置可以帮助我们更加精确地定位问题所在,提高调试效率。
2. 设置条件断点的语法在GDB中,我们可以使用"break"命令来设置条件断点。
它的基本语法如下:```break [文件名:][行号] if 表达式```其中,"文件名"表示要设置断点的源文件名,"行号"表示要设置断点的行号,"表达式"是触发断点的条件表达式。
3. 设置条件断点的示例假设我们有以下的C程序:```c#include <stdio.h>int m本人n() {int i;for (i = 0; i < 10; i++) {printf("d\n", i);}return 0;}```如果我们希望在i等于5时触发断点,我们可以使用以下命令:```break 4 if i==5```这样,当i等于5时,程序会在第4行停下来,我们就可以进行相关的调试操作了。
4. 使用条件断点的注意事项在使用条件断点时,我们需要注意一些细节:- 条件表达式应该是程序中当前可见的变量或表达式,否则可能会导致断点设置失败。
- 如果条件表达式比较复杂,建议使用小括号进行明确的分组,以避免出现歧义。
- 在设置条件断点之前,最好先确保程序的调试信息已经包含在可执行文件中,否则可能无法正常设置条件断点。
5. 删除条件断点在GDB中,我们可以使用"delete"命令来删除条件断点。
GDB基本使用方法
GDB是用来调试用户态程序的一款工具,可以追踪程序运行轨迹,打出调用栈,寄存器内容,查看内存等等
首先在编译时,我们必须要把调试信息加到可执行文件中。
使用编译器(cc/gcc/g++)的-g 参数可以做到这一点。
如果没有-g,你将看不见程序的函数名、变量名,所代替的全是运行时的内存地址。
启动GDB
直接找到gdb的路径执行就ok,进入GDB后可以输入help命令查看帮助信息
加载可执行文件启动
gdb executable-file
set args 参数列表
以上两步等同于
gdb –args executable-file 参数列表
run或者start都可以启动调试
多用于调试启动阶段就异常的程序
调试正在运行的程序
以下三种形式都可以attach到正在运行的程序上调试
ps -ef | grep http
www-data 24470 1 0 Jan17 ? 00:00:14 /usr/sbin/lighttpd
gdb attach 24470
gdb --pid 24470
gdb -p 24470
设置断点
break -- Set breakpoint at specified line or function
b func1
break func1 设置在func1处
b file:line 设置在文件的第几行处
b *0x指令地址设置在具体的某条汇编指令处
设置断点后,代码执行到func1处会被断住,方便我们查看当时的信息
打印调用栈
backtrace
bt
如果你要查看栈下面层的详细信息
frame 栈中的层编号
查看所有断点
info break
删除断点
delete 断点号
如果不加断点号为删除全部断点
禁用断点
disable 断点号
启用断点
enable 断点号
单步执行
next
或
n
单步进入
step
或
s
查看寄存器信息
info registers
i r
寄存器知识
pc 当前要执行的指令
sp 当前的栈地址
ra 当前调用返回地址,从当前函数栈返回后执行的第一条指令地址
v0 存储返回值
v1 当v0存储不下时使用
a0,a1,a2,a3 对应函数入参的第一,第二,第三,第四个参数,如果有更多参数,会压到当前栈中,调用的函数会去相应的位置取出来处理
t9 一般存放函数跳转地址
打印信息
print 变量或地址
查看内存信息
x/32xw 0x内存地址
以x:16进制的形式显示32w(32个字,一个字= 4B)的内存信息
反汇编函数
disassemble 函数地址
disassemble 函数名
线程断点
在线程号为id的线程上设置断点
break func thread id ,
如果你不指定thread 则表示你的断点设在所有线程上面
info threads 命令可以查看线程id号
thread id 可以切换到线程号为id的线程上,然后查看当前线程的寄存器及调用栈
当你的程序被GDB停住时,所有的运行线程都会被停住
调试core文件
Core文件是程序非法执行后core dump后产生的文件。
gdb –c coreFile binFile
注意事项,gdb调试core文件时会占用大量内存,出现vtysh(终端)被系统杀死的情况,一般需要留35M以上的内存
查看内存
cat /proc/meminfo
MemFree: 74732 kB
调试web_main
netstat -ple | grep web_main
9554 12705/web_main /var/usock/web_main.socket-0
9557 12707/web_main /var/usock/web_main.socket-1
一般挂住该进程,如果不准确,可以修改vi /etc/lighttpd/lighttpd.conf 查找min到该处,把2改为1,重启httpd服务/etc/init.d/httpd restart "socket" => "/var/usock/web_main.socket",
"bin-path" => "/var/local/web/func/web_main",
"check-local" => "disable",
"min-procs" => 2,
"max-procs" => 2,
自定义输出查看当前进程状态
ps -eTo tid,pid,wchan:32,comm| grep sslvpn
12592 12592 epoll_wait sslvpn
10110 12592 futex_wait_queue_me sslvpn
10111 12592 futex_wait_queue_me sslvpn。