使用gdb的源代码查看功能
gdb使用方法
gdb使用方法
GDB(GNU Debugger)是一款强大的调试工具,它可以帮
助我们调试程序,查看程序的运行状态,查看程序的内存状态,
查看程序的堆栈状态,以及查看程序的源代码。
GDB可以帮助我
们更好地理解程序的运行原理,从而更好地调试程序。
GDB的使用方法非常简单,首先,我们需要使用GCC编译
器编译我们的程序,并且在编译的时候加上-g参数,这样GDB才能够正确的调试程序。
然后,我们可以使用GDB命令来调试程序,比如,我们可以使用run命令来运行程序,使用break命令来设
置断点,使用step命令来单步调试程序,使用print命令来查看
变量的值,使用backtrace命令来查看程序的堆栈状态,以及使用list命令来查看程序的源代码。
GDB还提供了一些高级功能,比如,我们可以使用GDB的Python接口来编写自定义的调试脚本,以及使用GDB的TUI模
式来查看程序的源代码和堆栈状态。
总之,GDB是一款强大的调试工具,它可以帮助我们更好地
理解程序的运行原理,从而更好地调试程序。
使用GDB的方法非常简单,只需要使用GCC编译器编译程序,然后使用GDB命令
来调试程序即可。
编程工具系列之二------使用GDB的源代码查看功能
编程⼯具系列之⼆------使⽤GDB的源代码查看功能在调试程序的过程中,可以⾃由地查看相关的源代码(如果有源代码的话)是⼀项最基本的特性。
⼀些IDE在这⽅⾯做得相当好,GDB当然也提供了这项特性,虽然不如IDE直观,但在⼀定程度上要⽐IDE更加灵活和快捷。
GDB之所以能够知道对应的源代码,是因为调试版的可执⾏程序中记录了源代码的位置;因为源代码的位置在编译之后可能会移动到其它地⽅,所以GDB还会在当前⽬录中查找源代码,另外GDB也允许明确指定源代码的搜索位置。
默认情况下,GDB在编译时⽬录中搜索,如果失败则在当前⽬录中搜索,即$cdir:$cwd,其中$cdir指的是编译时⽬录(compilation directory),$cwd指的是当前⼯作⽬录(current working directory)。
在GDB中使⽤查看源代码相关的命令时,有⼀个当前⽂件的概念,当命令的位置参数没有限定⼀个⽂件的时候(不论是明确限定还是隐含限定),将使⽤当前⽂件。
当前⽂件默认是main函数所在⽂件,如果程序当前正处于断点位置,则断点所在⽂件即为当前⽂件。
与当前⽂件的概念类似,还存在⼀个当前⾏的概念,它默认为main函数的开始处。
如果使⽤gdb载⼊⼀个可执⾏⽂件,然后单单执⾏⼀条简单的list命令,你会发现输出的源代码并⾮是从第⼀⾏开始的,这是因为当前⾏默认在main函数附近处的缘故。
1.设置和获取源代码显⽰数量:默认情况下,GDB显⽰指定位置处以及其前后的10⾏代码,但是这是⼀个可设置的值。
set listsize count:设置list命令显⽰的源代码数量最多为count⾏,0表⽰不限制⾏数。
show listsize:显⽰listsize的值。
2.编辑源代码:在⼀些情况下,我们希望在编辑器中显⽰或者编辑源代码,GDB允许我们使⽤⾃⼰喜欢的编辑器。
可在环境变量EDITOR中指定GDB使⽤的编辑器,例如:EDITOR=/usr/bin/gedit;export EDITOR;gdbedit location:在编辑器中编辑位置location处的源代码,如果省略location,则编辑当前位置。
gdb技术手册(中文版)
gdb技术手册(中文版)2-12008-11-13 19:20:59| 分类:学习资料| 标签:|字号大中小订阅gdb技术手册(中文版)2 (2008-10-29 20:34:21)标签:杂谈一、查看源程序一、显示源代码GDB可以打印出所调试程序的源代码,当然,在程序编译时一定要加上-g的参数,把源程序信息编译到执行文件中。
不然就看不到源程序了。
当程序停下来以后,GDB会报告程序停在了那个文件的第几行上。
你可以用list命令来打印程序的源代码。
还是来看一看查看源代码的GDB命令吧。
list<linenum>;显示程序第linenum行的周围的源程序。
list<function>;显示函数名为function的函数的源程序。
list显示当前行后面的源程序。
list -显示当前行前面的源程序一般是打印当前行的上5行和下5行,如果显示函数是是上2行下8行,默认是10行,当然,你也可以定制显示的范围,使用下面命令可以设置一次显示源程序的行数。
set listsize <count>;设置一次显示源代码的行数。
show listsize查看当前listsize的设置。
list命令还有下面的用法:list<first>;,<last>;显示从first行到last行之间的源代码。
list ,<last>;显示从当前行到last行之间的源代码。
list +往后显示源代码。
一般来说在list后面可以跟以下这们的参数:<linenum>; 行号。
<+offset>; 当前行号的正偏移量。
<-offset>; 当前行号的负偏移量。
<filename:linenum>; 哪个文件的哪一行。
<function>; 函数名。
<filename:function>;哪个文件中的哪个函数。
交叉编译gdb使用
交叉编译gdb使用交叉编译GDB(GNU Debugger)通常用于在一个平台上生成适用于另一个平台的GDB 可执行文件。
这可能在嵌入式系统或不同体系结构的开发环境中很常见。
以下是一个基本的交叉编译GDB 的步骤:1. 准备交叉编译工具链:-获取并安装适用于目标平台的交叉编译工具链。
这包括交叉编译器、交叉链接器等。
这通常由目标平台的供应商提供。
2. 获取GDB 源码:-下载GDB 的源代码3. 配置GDB 交叉编译:-执行`configure` 脚本时,使用`--target` 选项指定目标平台,并通过`--host` 选项指定主机平台。
例如:```bash./configure --target=your_target_arch --host=your_host_arch --prefix=your_installation_path```其中,`your_target_arch` 是目标平台的体系结构(例如arm-linux-gnueabihf),`your_host_arch` 是主机平台的体系结构(例如x86_64-linux-gnu),`your_installation_path` 是GDB 的安装路径。
4. 编译和安装:-运行`make` 编译GDB,并使用`make install` 安装生成的GDB 可执行文件。
```bashmakemake install```5. 使用交叉编译GDB:-使用交叉编译生成的GDB 进行远程调试或与目标平台交互。
在使用GDB 时,确保使用正确的目标体系结构和调试符号文件。
```bashyour_installation_path/bin/your_target_arch-gdb your_program```请注意,这只是一个简单的步骤示例,实际的交叉编译过程可能会更复杂,具体取决于目标平台和你的开发环境。
确保查阅GDB 文档和目标平台的文档以获取详细的说明。
经典的GDB调试命令,包括查看变量,查看内存
经典的GDB调试命令,包括查看变量,查看内存经典的GDB调试命令,包括查看变量,查看内存在你调试程序时,当程序被停住时,你可以使⽤print命令(简写命令为p),或是同义命令inspect来查看当前程序的运⾏数据。
print命令的格式是:printprint /是表达式,是你所调试的程序的语⾔的表达式(GDB可以调试多种编程语⾔),是输出的格式,⽐如,如果要把表达式按16进制的格式输出,那么就是/x。
⼀、表达式print和许多GDB的命令⼀样,可以接受⼀个表达式,GDB会根据当前的程序运⾏的数据来计算这个表达式,既然是表达式,那么就可以是当前程序运⾏中的const常量、变量、函数等内容。
可惜的是GDB不能使⽤你在程序中所定义的宏。
表达式的语法应该是当前所调试的语⾔的语法,由于C/C++是⼀种⼤众型的语⾔,所以,本⽂中的例⼦都是关于C/C++的。
(⽽关于⽤GDB 调试其它语⾔的章节,我将在后⾯介绍)在表达式中,有⼏种GDB所⽀持的操作符,它们可以⽤在任何⼀种语⾔中。
@是⼀个和数组有关的操作符,在后⾯会有更详细的说明。
::指定⼀个在⽂件或是⼀个函数中的变量。
{}表⽰⼀个指向内存地址的类型为type的⼀个对象。
⼆、程序变量在GDB中,你可以随时查看以下三种变量的值:1. 全局变量(所有⽂件可见的)2. 静态全局变量(当前⽂件可见的)3. 局部变量(当前Scope可见的)如果你的局部变量和全局变量发⽣冲突(也就是重名),⼀般情况下是局部变量会隐藏全局变量,也就是说,如果⼀个全局变量和⼀个函数中的局部变量同名时,如果当前停⽌点在函数中,⽤print显⽰出的变量的值会是函数中的局部变量的值。
如果此时你想查看全局变量的值时,你可以使⽤::操作符:file::variablefunction::variable可以通过这种形式指定你所想查看的变量,是哪个⽂件中的或是哪个函数中的。
例如,查看⽂件f2.c中的全局变量x的值:gdb) p 'f2.c'::x当然,::操作符会和C++中的发⽣冲突,GDB能⾃动识别::是否C++的操作符,所以你不必担⼼在调试C++程序时会出现异常。
gdb l的用法
gdb l的用法
`gdb` 是一个强大的Linux 下的程序调试工具,用于调试C、C++ 等程序。
在 `gdb` 中,`l` 命令用于列出源代码。
当你使用 `gdb` 调试程序时,你可能会遇到一些断点或者异常,这时你可能会想查看当前的源代码以了解程序的执行状态。
这时,你可以使用 `l` 命令
来列出当前光标所在位置的源代码。
例如,如果你在 `gdb` 中设置了一个断点,并且程序在执行到该断点时停止,你可以使用以下命令来查看源代码:
```bash
(gdb) l
```
这将会列出当前文件和当前行号的源代码。
如果你只想列出当前文件的一部分源代码,你可以指定起始行和结束行,例如:
```bash
(gdb) l 10,20
```
这将会列出从第10行到第20行的源代码。
注意:`l` 命令的输出可能会因为编辑器或IDE的不同而略有不同。
gdb常用调试命令
gdb常用调试命令
1. run: 用于开始程序调试
2. break: 用于设置断点,可以是源代码的行号、函数名或地址
3. clear: 用于清除断点,可以是源代码的行号、函数名或地址
4. continue: 用于让程序继续执行,直到遇到断点
5. stepi: 单步运行,每次运行一条汇编指令
6. step: 单步运行,每次运行一行C源代码
7. nexti: 运行至次汇编指令,不进入函数内部
8. next: 运行至次行C源代码,不进入函数内部
9. jump: 任意跳转到某行源代码运行
10. until: 从断点处运行到某行源代码,不包括该行
11. finish: 运行到当前函数的返回处
12. info breakpoints: 显示所有的断点
13. delete: 删除断点
14. watch: 设置变量的某种变化条件
15. list: 显示源代码
16. disassemble: 反汇编指令
17. x: 以十六进制及字符串查看内存值
18. print: 打印数据、表达式及变量
19. set: 设置变量值
20. backtrace: 显示堆栈调用过程。
linux系统调试工具GDB 命令详细解释..
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后面带上参数可以传递给正在调试的程序。
GDB中文手册
使用GDB一般来说GDB主要调试的是C/C++的程序。
要调试C/C++的程序,首先在编译时,我们必须要把调试信息加到可执行文件中。
使用编译器(cc/gcc/g++)的 -g 参数可以做到这一点。
如:> cc -g hello.c -o hello> g++ -g hello.cpp -o hello如果没有-g,你将看不见程序的函数名、变量名,所代替的全是运行时的内存地址。
当你用-g把调试信息加入之后,并成功编译目标代码以后,让我们来看看如何用gdb来调试他。
进入GDB启动GDB的方法有以下几种:1、gdb programprogram也就是你的执行文件,一般在当然目录下。
2、gdb program core用gdb同时调试一个运行程序和core文件,core是程序非法执行后core dump后产生的文件。
3、gdb pid如果你的程序是一个服务程序,那么你可以指定这个服务程序运行时的进程ID。
gdb会自动attach上去,并调试他。
program应该在PATH环境变量中搜索得到。
GDB启动时,可以加上一些GDB的启动开关,详细的开关可以用gdb -help查看。
我在下面只例举一些比较常用的参数:参数说明-symbols [file](-s)读取文件中的符号表-exec [file] (-e)调试一个可执行文件-se [file]上二者的缩写-core [file](-c)读入一个core dump文件-pid number (-p)启动attach模式,除错一个执行中的行程。
number 是目标行程的pid-directory [directory] (-d)将directory加入原始码的搜寻路行-readnow (-r)一次读取完所有的符号表,这会让启动gdb的时间变长,但在执行往后的除错动作会较快速。
下列还有部分选择性的参数,我列出几个目前用的到的:-quiet -silent -q安静模式,启动时gdb将不会显示版权页。
gdb调试命令
gdb调试命令 gdb是⼀个在UNIX环境下的命令⾏调试⼯具。
如果需要使⽤gdb调试程序,请在gcc时加上-g选项。
下⾯的命令部分是简化版,⽐如使⽤l代替list等等。
1.基本命令1)进⼊GDB #gdb test test是要调试的程序,由gcc test.c -g -o test⽣成。
进⼊后提⽰符变为(gdb) 。
2)查看源码 (gdb) l 源码会进⾏⾏号提⽰。
如果需要查看在其他⽂件中定义的函数,在l后加上函数名即可定位到这个函数的定义及查看附近的其他源码。
或者:使⽤断点或单步运⾏,到某个函数处使⽤s进⼊这个函数。
3)设置断点 (gdb) b 6 这样会在运⾏到源码第6⾏时停⽌,可以查看变量的值、堆栈情况等;这个⾏号是gdb的⾏号。
4)查看断点处情况 (gdb) info b 可以键⼊"info b"来查看断点处情况,可以设置多个断点;5)运⾏代码 (gdb) r6)显⽰变量值 (gdb) p n 在程序暂停时,键⼊"p 变量名"(print)即可; GDB在显⽰变量值时都会在对应值之前加上"$N"标记,它是当前变量值的引⽤标记,以后若想再次引⽤此变量,就可以直接写作"$N",⽽⽆需写冗长的变量名;7)观察变量 (gdb) watch n在某⼀循环处,往往希望能够观察⼀个变量的变化情况,这时就可以键⼊命令"watch"来观察变量的变化情况,GDB在"n"设置了观察点;8)单步运⾏ (gdb) n9)程序继续运⾏ (gdb) c 使程序继续往下运⾏,直到再次遇到断点或程序结束;10)退出GDB (gdb) q2.断点调试命令格式 例⼦ 作⽤break + 设置断点的⾏号 break n 在n⾏处设置断点tbreak + ⾏号或函数名 tbreak n/func 设置临时断点,到达后被⾃动删除break + filename + ⾏号 break main.c:10 ⽤于在指定⽂件对应⾏设置断点break + <0x...> break 0x3400a ⽤于在内存某⼀位置处暂停break + ⾏号 + if + 条件 break 10 if i==3 ⽤于设置条件断点,在循环中使⽤⾮常⽅便info breakpoints/watchpoints [n] info break n表⽰断点号,查看断点/观察点的情况clear + 要清除的断点⾏号 clear 10 ⽤于清除对应⾏的断点,要给出断点的⾏号,清除时GDB会给出提⽰delete + 要清除的断点编号 delete 3 ⽤于清除断点和⾃动显⽰的表达式的命令,要给出断点的编号,清除时GDB不会给出任何提⽰disable/enable + 断点编号 disable 3 让所设断点暂时失效/使能,如果要让多个编号处的断点失效/使能,可将编号之间⽤空格隔开awatch/watch + 变量 awatch/watch i 设置⼀个观察点,当变量被读出或写⼊时程序被暂停rwatch + 变量 rwatch i 设置⼀个观察点,当变量被读出时,程序被暂停catch 设置捕捉点来补捉程序运⾏时的⼀些事件。
GDB使用说明
GDB使用说明文档一、简介:GDB能让你观察一个程序在执行时的内部活动,或程序出错时发生了什么。
GDB主要能为你做以下四件事,帮助你找出程序中的错误。
1.运行你的程序,设置所有的能影响程序运行的东西。
2.保证你的程序在指定的条件下停止。
3.当你程序停止时,让你检查发生了什么。
4.改变你的程序。
那样你可以试着修正某个bug引起的问题,然后继续查找另一个bug.二、GDB运行方式1.通常的调试可执行程序:gdb <可执行文档名>2.调试执行文件指定一个core文件:gdb <可执行文件名> core3.为执行的文件指定一个进程号:gdb <可执行文件名> <进程号>三、GDB常用命令下面先说明GDB的基本指令:(大部分命令使用时只要输入第一个字母就好了,同时支持TAB的自动补全,与shell相类似)1.help:查看帮助2.file:指定一个可执行文件进行调试,gdb将读取些文件的调试信息3.list:列出程序源文件4.run:装载完要调试的可执行文件后,可以用run命令运行可执行文件5.break:设置断点breakpoint,如b 25,则在源程序的第25行设置一个断点,当程序执行到第25行时,就会产生中断;也可以使用b funcname,funcname为函数的名称,当程序调用些函数时,则产生中断6.continue:c命令可以使中断的程序继续执行,直到下一个中断点或程序结束7.print:输入某个变量的值,如程序定义了一个int aa的就是,p aa就会输出aa的当前值8.next:程序执行到断点时中断执行,可以用n指令进行单步执行9.step:程序执行到断点时中断执行,可以用s指令进行单步执行进某一函数,如果已经进入了某函数,而想退出该函数返回到它的调用函数中,可使用命令finish10.attach:命令为attach PROCESS-ID,这个命令把一个已经运行的进程(在gdb外启动)连接入gdb,以便调试。
gdbserver 编译
gdbserver 编译
GDBserver是一个非常有用的工具,它可以帮助我们调试远程的应用程序。
在实际项目中,这个工具经常被使用到。
以下是我对GDBserver 编译的一些总结:
1. 编译环境准备
在开始编译前,你需要安装交叉编译器。
这个编译器是由交叉编译工具提供的,你可以通过这个交叉编译器来构建目标平台上的应用程序。
2. 获取源代码
GDBserver的最新源代码可以在GNU 官网上下载。
下载好之后,你需要解压缩源代码。
3. 配置编译选项
在开始编译前,你需要配置编译选项。
你需要使用./configure 命令,这个命令会根据你的系统自动选择合适的编译选项。
4. 进行编译
在配置了编译选项后,你可以开始编译了。
你需要使用make命令进行编译。
如果编译没有出现问题,你会得到一个gdbserver可执行文件。
5. 测试gdbserver
完成编译后,你需要测试gdbserver是否能正常工作。
你可以将gdbserver复制到目标平台上,然后运行。
6. 排错
如果你测试过程中遇到了问题,可以通过gdbserver的日志信息进行排错。
在调试的过程中,你需要仔细观察日志信息,找出错误原因。
总结:
通过以上这些步骤,你可以完成gdbserver的编译。
需要注意的是,在编译过程中,你需要仔细关注每一个出现的错误。
如果你遇到
了问题,可以在相关论坛上发帖求助,这么做可以得到更好的帮助和解答。
gdb bt 参数-概述说明以及解释
gdb bt 参数-概述说明以及解释1.引言1.1 概述引言部分是文章的开篇,用于介绍文章的概述,为读者提供一个整体的认识。
在本文中,我们将着重介绍GDB调试工具中的bt参数。
GDB 是一款功能强大的调试器,可帮助开发人员在程序出现问题时进行调试和定位错误。
而bt参数是GDB提供的一个重要命令,用于显示函数调用栈信息。
通过理解和掌握bt参数的使用方法,我们可以更加高效地进行程序调试和错误排查。
在本篇文章中,我们将首先对GDB进行简要的介绍,包括它的基本功能和使用场景。
然后,我们将详细介绍GDB的调试命令,包括常用的调试命令和调试技巧。
接着,我们将重点探讨GDB中的bt参数,解释它的作用和用法,并通过实例来演示如何使用bt参数进行函数调用栈的跟踪。
最后,我们将总结GDB的重要性,分析bt参数的作用,并给出一些建议,帮助读者更好地利用GDB进行程序调试。
通过阅读本文,读者将能够了解GDB调试工具的基本原理和使用方法,掌握bt参数的基本用法,以及在实际的程序调试过程中如何高效地利用GDB进行错误定位和排查。
希望本文能够对读者在日常的开发工作中有所帮助,提升程序调试的效率和准确性。
1.2 文章结构文章结构部分的内容应该包括对整篇文章的组织和结构进行说明。
下面是一个可能的描述:文章结构部分介绍了整篇文章的组织和结构。
本文共分为三个主要部分:引言、正文和结论。
引言部分包括文章的概述、文章结构和目的。
在概述部分,将简要介绍GDB及其在调试过程中的重要性。
在文章结构部分,将说明整篇文章按照引言、正文和结论的结构进行组织。
在目的部分,将阐述本文的目标和意义,即分析GDB中的bt参数对调试的作用。
正文部分是本文的主要内容,将详细介绍GDB的简介、GDB调试命令和GDB中的bt参数。
在GDB简介部分,将介绍GDB的定义、功能和用途,以便读者对GDB有一个初步的了解。
在GDB调试命令部分,将介绍一些常用的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打印函数指针1.打印函数指针的值在 GDB 中,我们可以使用 `p` 命令来打印函数指针的值。
例如,假设我们有一个名为 `func_ptr` 的函数指针变量,可以使用以下命令来打印它的值:```p func_ptr```这将打印出 `func_ptr` 对应的函数指针的值。
2.打印函数指针指向的函数的源代码除了打印函数指针的值,有时我们还想知道函数指针指向的函数的源代码。
在 GDB 中,可以使用 `info address` 命令来获取函数指针指向的函数的地址,然后使用 `list` 命令来查看与该地址相关联的源代码。
以下是具体步骤:首先,使用`p`命令来打印函数指针的值,记下它的值:```p func_ptr```接下来,使用 `info address` 命令来获取函数指针所指向函数的地址:```info address <func_ptr>```请替换 `<func_ptr>` 为前一步中获得的函数指针的值。
``````这将显示出与函数指针指向的函数地址相关联的源代码。
3.打印函数指针指向的函数的参数和返回值有时候,在调试过程中我们想要知道函数指针指向的函数的参数和返回值的值。
在 GDB 中,可以使用 `print` 命令来打印函数指针指向的函数的参数和返回值。
以下是具体步骤:首先,使用`p`命令来打印函数指针的值,记下它的值:```p func_ptr```接下来,使用 `call` 命令来调用函数指针指向的函数,并将其参数和返回值打印出来。
假设函数指针指向的函数的参数为 `arg1` 和`arg2`,返回值为 `ret`,可以使用以下命令:```call ((<return_type> (*)(<arg1_type>,<arg2_type>))func_ptr)(arg1_value, arg2_value)```请替换 `<return_type>`、`<arg1_type>`等为实际的返回值类型和参数类型,并将 `arg1_value` 和 `arg2_value` 替换为相应的参数值。
GDB 使用
GDB 使用——Linux C编程收藏简述一列文件清单二:执行程序三:显示数据四:断点(breakpoint)五.断点的管理六.变量的检查和赋值七. 单步执行八.函数的调用九.机器语言工具十.信号GDB的使用方法简述一列文件清单* List(gdb) list line1,line2二:执行程序要想运行准备调试的程序,可使用run命令,在它后面可以跟随发给该程序的任何参数,包括标准输入和标准输出说明符(<和> )和外壳通配符(*、?、[、])在内。
如果你使用不带参数的run命令,gdb就再次使用你给予前一条run命令的参数,这是很有用的。
利用set args 命令就可以修改发送给程序的参数,而使用show args 命令就可以查看其缺省参数的列表。
(gdb)set args –b –x(gdb) show argsbacktrace命令为堆栈提供向后跟踪功能。
Backtrace 命令产生一张列表,包含着从最近的过程开始的所以有效过程和调用这些过程的参数。
三:显示数据* 利用print 命令可以检查各个变量的值。
(gdb) print p (p为变量名)print 是gdb的一个功能很强的命令,利用它可以显示被调试的语言中任何有效的表达式。
表达式除了包含你程序中的变量外,还可以包含以下内容:1. 对程序中函数的调用(gdb) print find_entry(1,0)2. 数据结构和其他复杂对象(gdb) print *table_start$8={e=reference=’\000’,location=0x0,next=0x0}3. 值的历史成分(gdb)print $1 ($1为历史记录变量,在以后可以直接引用$1 的值)4. 人为数组人为数组提供了一种去显示存储器块(数组节或动态分配的存储区)内容的方法。
早期的调试程序没有很好的方法将任意的指针换成一个数组。
就像对待参数一样,让我们查看内存中在变量h后面的10个整数,一个动态数组的语法如下所示:base@length因此,要想显示在h后面的10个元素,可以使用h@10:(gdb)print h@10$13=(-1,345,23,-234,0,0,0,98,345,10)* whatis 命令可以显示某个变量的类型(gdb) whatis ptype = int *四:断点(breakpoint)break命令(可以简写为b)可以用来在调试的程序中设置断点,该命令有如下四种形式:* break line-number 使程序恰好在执行给定行之前停止。
较详细的gdb入门教程
其中,第一行是版本信息,倒数第二行表示正载入符号表,最后一行 (gdb) 则是** gdb 的提示符**。
请注意,若你倒数第二行有 (no debugging symbols found) 字样,请确保在编译选项里加上 -g 选项。
当然,如果你直接输入 gdb 启动,不加文件名,也可以。只是,你要使用 file 命令手动载入可执行文件。
例子:
1 (gdb) break main //main函数处设置断点 2 Breakpoint 1 at 0x874: file example.cpp, line 10. 3 (gdb) break 11 //在第11行处设置断点 4 Breakpoint 2 at 0x883: file example.cpp, line 11.
1 Starting program: /home/acceptedzhs/example 2 10 3 4 Breakpoint 1, main () at example.cpp:13 5 13 printf("%d\n",f(a)); 6 (gdb) s 7 f (x=10) at example.cpp:5 //step命令,进入了f函数内部 8 5 int ans=1; 9 (gdb)
命令:step(简写为 s) 格式:step(无参数) 作用:单步执行。若当前行有函数调用,则进入该函数内部。
但是,又有人想偷懒了。反复敲 n 与 s 依然很麻烦。怎么办呢?
gdb有个特性:若什么都不输,直接按回车,则会执行上一次执行的命令。
所以,只要开始敲个 n 或 s,然后一直敲回车就行了。
举个例子好了:
1 (gdb) b 13 2 Breakpoint 1 at 0x89b: file example.cpp, line 13. 3 (gdb) r 4 Starting program: /home/acceptedzhs/example 5 10 6 7 Breakpoint 1, main () at example.cpp:13 8 13 printf("%d\n",f(a)); 9 (gdb) n 10 3628800 11 14 return 0; 12 (gdb) [回车] //看到没,执行了上次的命令,即next 13 15 } 14 (gdb)
gdb使用指南
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常用命令
gdb常⽤命令基本信息查看栈信息不管是操作转储⽂件还是⽤GDB设置断点进⾏调试,都可以输⼊ (gdb)bt 打印栈内容进⾏查看。
⼀般的宕机BUG,看下宕机的位置,然后看下源代码基本就可以解决了。
但是很多情况下简单的 (gdb)bt 还查不到问题,这时候就要涉及到⽐较复杂的操作。
下⾯罗列了⼀些对栈的操作:(gdb) bt:显⽰所有栈帧(gdb) bt 10:显⽰前⾯10个栈帧(gdb) bt -10:显⽰后⾯10个栈帧(gdb) bt full:显⽰栈帧以及局部变量(gdb) bt full 10:显⽰前⾯10个栈帧以及局部变量(gdb) bt full -10:显⽰后⾯10个栈帧以及局部变量(gdb) frame <栈帧编号>:进⼊指定的栈帧中,然后可以查看当前栈帧中的局部变量,以及栈帧内容等信息(gdb) info frame <栈帧编号>:可以查看指定栈帧的详细信息(gdb) up:进⼊上层栈帧(gdb) down:进⼊下层栈帧变量调试BUG过程中查看变量信息是很有帮助的操作,查看⽅式如下:(gdb) p <变量名>寄存器对于调试来说寄存器中的值也很重要,可以查看到当前正在执⾏的指令的地址等。
具体操作罗列如下:(gdb) info reg:显⽰所有寄存器。
可以简写为:i r。
如果要查看具体的寄存器可以这样:i $ebx(gdb) p $eax:显⽰eax寄存器内容(gdb) p/c $eax:⽤字符显⽰eax寄存器内容,反斜杠后⾯的是显⽰格式,可使⽤的格式见下表:该表在显⽰内存内容的x命令中也是通⽤的格式说明x显⽰为⼗六进制数d显⽰为⼗进制数u显⽰位为符号⼗进制数o显⽰为⼋进制数t显⽰为⼆进制数a显⽰为地址c显⽰为字符(ASCII)f显⽰为浮点数s显⽰为字符串i显⽰为机器语⾔(仅在显⽰内存的x命令中可⽤)内存可以查看具体内存地址中的内容,⽐如:⽬前执⾏的汇编指令,以及栈中的内容等。
源码编译gdb
源码编译gdb
源码编译gdb是一项非常重要的技能,尤其对于那些需要深入了解调试器内部运作机制的开发者来说。
以下是一些关于如何编译gdb 源码的简要指南:
1. 下载源代码
您可以从GNU官方网站上下载最新版本的gdb源代码。
这里需要注意,您需要下载对应于您正在使用的系统和计算机架构的版本。
2. 安装必要的依赖项
在编译gdb之前,您需要确保您的系统上已经安装了所有必要的依赖项。
这些依赖项通常包括GNU编译器集合(GCC), GNU调试器(GDB),以及其他一些基本的构建工具和库文件。
3. 配置编译环境
在编译gdb之前,您需要先配置编译环境。
这通常涉及到设置环境变量,包括指定安装目录、设置路径等等。
4. 运行configure脚本
要使用GNU Autotools来编译gdb,您需要在源代码目录中运行configure脚本。
这个脚本将检查您的系统是否满足所有依赖项,并生成构建所需的Makefile文件。
5. 运行make命令进行构建
一旦configure脚本运行成功,您就可以运行make命令来构建gdb。
这个过程可能需要一些时间,具体取决于您的系统性能和源代码规模。
6. 运行make install命令进行安装
最后一步是运行make install命令,将编译后的gdb二进制文件和库文件安装到指定的目录中。
完成这个过程之后,您就可以使用编译后的gdb来进行调试了。
总之,编译gdb源码需要一定的技能和耐心。
但是,如果您需要深入了解调试器的内部机制,并对其进行自定义设置,这项技能可以帮助您更好地完成这项工作。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
在调试程序的过程中,可以自由地查看相关的源代码(如果有源代码的话)是一项最基本的特性。
一些IDE在这方面做得相当好,GDB当然也提供了这项特性,虽然不如IDE直观,但在一定程度上要比IDE更加灵活和快捷。
GDB之所以能够知道对应的源代码,是因为调试版的可执行程序中记录了源代码的位置;因为源代码的位置在编译之后可能会移动到其它地方,所以GDB还会在当前目录中查找源代码,另外GDB也允许明确指定源代码的搜索位置。
默认情况下,GDB在编译时目录中搜索,如果失败则在当前目录中搜索,即$cdir:$cwd,其中$cdir指的是编译时目录(compilation directory),$cwd指的是当前工作目录(current working directory)。
在GDB中使用查看源代码相关的命令时,有一个当前文件的概念,当命令的位置参数没有限定一个文件的时候(不论是明确限定还是隐含限定),将使用当前文件。
当前文件默认是main函数所在文件,如果程序当前正处于断点位置,则断点所在文件即为当前文件。
与当前文件的概念类似,还存在一个当前行的概念,它默认为main函数的开始处。
如果使用gdb载入一个可执行文件,然后单单执行一条简单的list命令,你会发现输出的源代码并非是从第一行开始的,这是因为当前行默认在main函数附近处的缘故。
1.设置和获取源代码显示数量:
默认情况下,GDB显示指定位置处以及其前后的10行代码,但是这是一个可设置的值。
set listsize count:设置list命令显示的源代码数量最多为count行,0表示不限制行数。
show listsize:显示listsize的值。
2.编辑源代码:
在一些情况下,我们希望在编辑器中显示或者编辑源代码,GDB允许我们使用自己喜欢的编辑器。
可在环境变量EDITOR中指定GDB使用的编辑器,例如:EDITOR=/usr/bin/gedit;export EDITOR;gdb edit location:在编辑器中编辑位置location处的源代码,如果省略location,则编辑当前位置。
3.搜索源代码:
有的时候,我们希望在当前文件中进行搜索,GDB提供了这样的命令。
search regexp:从当前行的下一行开始向前搜索。
rev regexp :从当前行的上一行开始向后搜索。
有的时候,你会发现search命令总是提示“Expression not found”,这是因为当前行可能已经是最后一行了,特别是文件很短的时候。
这里需要注意的是,任何list命令都会影响当前行的位置,并且由于每次都是多行输出,所以对当前行的影响并非简单地向前一行或者向后一行。
search命令本身也会影响当前行的位置。
4.源代码位置:
GDB之所以可以查看到源代码,是因为它知道源代码放在哪里。
在一个调试会话中,GDB维护了一个源代码查找目录列表,默认值是编译目录和当前工作目录。
当GDB需要一个源文件的时候,它依次在这些目录中查找,直到找到一个或者抛出错误。
GDB还维护了一个路径替换规则,将要搜索的原始路径按照找到的第一个规则做前缀替换,然后再在源码搜索目录中查找文件。
GDB允许明确指定源代码位置,或者路径替换规则,以应付源代码位置迁移的情况。
directory path-list:将一个或者多个源代码搜索目录加入到当前源码搜索目录列表的前面,目录之间使用空格间隔。
directory:不带参数的directory将源码搜索目录恢复为默认值。
set directories path-list:将源码目录设置为path-list,但是会补上默认目录。
show directories:显示源码搜索目录列表。
set substitute-path from to:设置目录替换规则,放置在规则列表的末端。
unset substitute-path [path]:删除path对应的替换规则,或者删除所有的替换规则。
show substitute-path [path]:显示path对应的替换规则,或者显示所有的替换规则。
5.查看机器码:
在一些必要的时候,我们需要查看汇编代码来诊断问题。
GDB提供了这种可能。
GDB提供了两种能力:显示源代码位置与指令地址之间的映射;显示指定位置的汇编代码。
info line linespec:显示源代码linespec处对应的汇编地址范围。
info line *addr:显示地址addr处对应的源代码位置。
disassemble,disassemble /m,disassemble /r:显示指定地址范围内的汇编代码,有4种使用形式,第一种不带参数,显示当前正在执行的函数的汇编代码;第二种是一个参数,显示该地址所在函数的汇编代码;第三种是两个参数的disassemble start,end,显示地址[start,end)内的汇编代码;第四种是两个参数
的disassemble start,+length,显示地址[start,start+length)内的汇编代码。
参数可以是16进制的地址,也可以是函数名。
/m表示混合输出源代码和汇编代码,/r表示混合输出二进制和汇编代码。
set disassembly-flavor instruction-set:设置显示汇编代码时使用的风格,目前只针对intel x86系列,可取的值为att和intel,默认是att。
show disassembly-flavor:显示disassembly-flavor设置
set disassemble-next-line on|off|auto:当程序停止下来的时候,是否显示下一行源代码的汇编代码,默认为off。
show disassemble-next-line:显示disassemble-next-line设置。
6.显示指定位置的源代码:
list命令可用于显示指定位置处的源代码。
list命令会影响当前行和当前文件。
list命令有多种方式指定要显示的源代码范围,可以是行号,函数名,甚至是指令地址。
常用的如下:
list linenum:显示指定行数附近的代码。
list function:显示指定函数附近的代码。
list *addr:显示指定地址附近的代码。