【VC++开源代码栏目提醒】:以下是网学会员为您推荐的VC++开源代码-linux下Vi编辑器的gdb调试 - 培训资料,希望本篇文章对您学习有所帮助。
我的百科 我的贡献 草稿箱 百度首页 登录 到百科首页 新闻 网页 贴吧 知道 MP3 图片 视频 百科 帮助设置 首页 自然 文化 地理 历史 生活 社会 艺术 人物 经济 科学 体育 编辑词条 gdb 目录隐藏 一 列文件清单 二执行程序 三显示数据 四断点breakpoint 五断点的管理 六变量的检查和赋值 七. 单步执行 八函数的调用 九机器语言工具 十信号 GDB的使用方法 用GDB调试程序 一 列文件清单 二执行程序 三显示数据 四断点breakpoint 五断点的管理 六变量的检查和赋值 七. 单步执行 八函数的调用 九机器语言工具 十信号 GDB的使用方法 用GDB调试程序 GDB是GNU
开源组织发布的一个强大的UNIX下的程序调试工具。
或许各位比较喜欢那种图形界面方式的像
VC、BCB等IDE的调试但如果你是在 UNIX平台下做软件你会发现GDB这个调试工具有比
VC、BCB的图形化调试器更强大的功能。
所谓“寸有所长尺有所短”就是这个道理。
一般来说GDB主要帮忙你完成下面四个方面的功能 1、启动你的程序可以按照你的自定义的要求随心所欲的运行程序。
2、可让被调试的程序在你所指定的调置的断点处停住。
断点可以是条件表达式 3、当程序被停住时可以检查此时你的程序中所发生的事。
4、动态的改变你程序的执行环境。
《GDB使用手册》 编辑本段 一 列文件清单 List gdb list line1line2 编辑本段 二执行程序 要想运行准备调试的程序可使用run命令在它后面可以跟随发给该程序的任何参数包括标准输入和标准输出说明符 和shell通配符、、、在内。
如果你使用不带参数的run命令gdb就再次使用你给予前一条run命令的参数这是很有用的。
利用 set args 命令就可以修改发送给程序的参数而使用show args 命令就可以查看其缺省参数的列表。
gdbset args –b –x gdb show args backtrace命令为堆栈提供向后跟踪功能。
Backtrace 命令产生一张列表包含着从最近的过程开始的所有有效过程和调用这些过程的参数。
编辑本段 三显示数据 利用print 命令可以检查各个变量的值。
gdb print p p为变量名 print 是gdb的一个功能很强的命令利用它可以显示被调试的语言中任何有效的表达式。
表达式除了包含你程序中的变量外还可以包含以下内容 对程序中函数的调用 gdb print fin 数据结构和其他复杂对象 gdb print table_start ereference’000’location0x0next0x0 值的历史成分 gdbprint 为历史记录变量在以后可以直接引用的值 人为数组 人为数组提供了一种去显示存储器块数组节或动态分配的存储区内容的方法。
早期的调试程序没有很好的方法将任意的指针换成一个数组。
就像对待参数一样让我们查看内存中在变量h后面的10个整数一个动态数组的语法如下所示 baselength 因此要想显示在h后面的10个元素可以使用h10 gdbprint h10 -134523-2340009834510 whatis 命令可以显示某个变量的类型 gdb whatis p type int 编辑本段 四断点breakpoint break命令可以简写为b可以用来在调试的程序中设置断点该命令有如下四种形式 break line-number 使程序恰好在执行给定行之前停止。
break function-name 使程序恰好在进入指定的函数之前停止。
break line-or-function if condition 如果condition条件是真程序到达指定行或函数时停止。
break routine-name 在指定例程的入口处设置断点 如果该程序是由很多原文件构成的你可以在各个原文件中设置断点而不是在当前的原文件中设置断点其方法如下 gdb break filename:line-number gdb break filename:function-name 要想设置一个条件断点可以利用break if命令如下所示 gdb break line-or-function if expr 例 gdb break 46 if testsize100 从断点继续运行countinue 命令 编辑本段 五断点的管理 1显示当前gdb的断点信息 gdb info break 他会以如下的形式显示所有的断点信息 Num Type Disp Enb Address What 1 breakpoint keep y 0x000028bc in init_random at qsort2.c:155 2 breakpoint keep y 0x0000291c in init_organ at qsort2.c:168 删除指定的某个断点 gdb delete breakpoint 1 该命令将会删除编号为1的断点如果不带编号参数将删除所有的断点 gdb delete breakpoint 禁止使用某个断点 gdb disable breakpoint 1 该命令将禁止断点 1同时断点信息的 Enb域将变为 n 允许使用某个断点 gdb enable breakpoint 1 该命令将允许断点 1同时断点信息的 Enb域将变为 y 清除原文件中某一
代码行上的所有断点 gdbclean number 注number 为原文件的某个
代码行的行号 编辑本段 六变量的检查和赋值 whatis:识别数组或变量的类型 ptype:比whatis的功能更强他可以提供一个结构的定义 set variable:将值赋予变量 print 除了显示一个变量编辑本段 七. 单步执行 next 不进入的单步执行 step 进入的单步执行如果已经进入了某函数而想退出该函数返回到它的调用函数中可使用命令finish 编辑本段 八函数的调用 call name 调用和执行一个函数 gdb call gen_and_sork 123410 gdb call printf“abcd” 4 finish 结束执行当前函数显示其返回值如果有的话 编辑本段 九机器语言工具 有一组专用的gdb变量可以用来检查和修改计算机的通用寄存器gdb提供了目前每一台计算机中实际使用的4个寄存器的标准名字 pc 程序计数器 fp 帧指针当前堆栈帧 sp 栈指针 ps 处理器状态 编辑本段 十信号 gdb通常可以捕捉到发送给它的大多数信号通过捕捉信号它就可决定对于正在运行的进程要做些什么工作。
例如按CTRL-C将中断信号发送给 gdb通常就会终止gdb。
但是你或许不想中断gdb真正的目的是要中断gdb正在运行的程序因此gdb要抓住该信号并停止它正在运行的程序这样就可以执行某些调试操作。
Handle命令可控制信号的处理他有两个参数一个是信号名另一个是接受到信号时该作什么。
几种可能的参数是 nostop 接收到信号时不要将它发送给程序也不要停止程序。
stop 接受到信号时停止程序的执行从而允许程序调试显示一条表示已接受到信号的消息禁止使用消息除外 print 接受到信号时显示一条消息 noprint 接受到信号时不要显示消息而且隐含着不停止程序运行 pass 将信号发送给程序从而允许你的程序去处理它、停止运行或采取别的动作。
nopass 停止程序运行但不要将信号发送给程序。
例如假定你截获SIGPIPE信号以防止正在调试的程序接受到该信号而且只要该信号一到达就要求该程序停止并通知你。
要完成这一任务可利用如下命令 gdb handle SIGPIPE stop print 请注意UNIX的信号名总是采用大写字母你可以用信号编号替代信号名如果你的程序要执行任何信号处理操作就需要能够测试其信号处理程序为此就需要一种能将信号发送给程序的简便方法这就是signal命令的任务。
该命令的参数是一个数字或者一个名字如SIGINT。
假定你的程序已将一个专用的SIGINT键盘输入或CTRL-C信号2信号处理程序设置成采取某个清理动作要想测试该信号处理程序你可以设置一个断点并使用如下命令 gdb signal 2 continuing with signal SIGINT2 该程序继续执行但是立即传输该信号而且处编辑本段 GDB的使用方法 GDB是一个强大的命令行调试工具。
大家知道命令行的强大就是在于其可以形成 执行序列形成脚本。
UNIX下的软件全是命令行的这给程序开发提代供了极大的 便利命令行软件的优势在于它们可以非常容易的集成在一起使用几个简单的已 有工具的命令就可以做出一个非常强大的功能。
于是UNIX下的软件比Windows下的软件更能有机地结合各自发挥各自的长处组合 成更为强劲的功能。
而Windows下的图形软件基本上是各自为营互相不能调用很 不利于各种软件的相互集成。
在这里并不是要和Windows做个什么比较所谓“寸有 所长尺有所短”图形化工具还是有不如命令行的地方。
编辑本段 用GDB调试程序 GDB概述 ———— GDB是GNU
开源组织发布的一个强大的UNIX下的程序调试工具。
或许各位比较喜欢 那种图形界面方式的像
VC、BCB等IDE的调试但如果你是在UNIX平台下做软件你 会发现GDB这个调试工具有比
VC、BCB的图形化调试器更强大的功能。
所谓“寸有所 长尺有所短”就是这个道理。
一般来说GDB主要帮忙你完成下面四个方面的功能 1、启动你的程序可以按照你的自定义的要求随心所欲的运行程序。
2、可让被调试的程序在你所指定的调置的断点处停住。
断点可以是条件表达式 3、当程序被停住时可以检查此时你的程序中所发生的事。
4、动态的改变你程序的执行环境。
从上面看来GDB和一般的调试工具没有什么两样基本上也是完成这些功能不过 在细节上你会发现GDB这个调试工具的强大大家可能比较习惯了图形化的调试工 具但有时候命令行的调试工具却有着图形化工具所不能完成的功能。
让我们一 一看来。
一个调试示例 —————— 源程序tst.c 1 include 2 3 int funcint n 4 5 int sum0i 6 fori0 i 7 8 sumi 9 10 return sum 11 12 13 14 main 15 16 int i 17 long result 0 18 fori1 i cc -g tst.c -o tst 使用GDB调试 hchen/test gdb tst