MyException - 我的异常网
当前位置:我的异常网» C++ » 提问:gdb有关问题

提问:gdb有关问题(2)

www.MyException.Cn  网友分享于:2013-02-18  浏览:9次

幸 运的是,在gdb的源代码中也提供了关于如何一些实现这些步近命令的建议。对于Hitachi SH-2芯片而言,在gdb/sh-stub.c文件中说明了函数doSStep()的使用,对于其它种类的芯片,函数的名字也差不多,请看文件 gdb/i386-stub.c和gdb/m68k-stub.c

3.gdb的其它功能

Gdb还可以求解在控制台中输入的任意的C表达式的值,包括包含有对远端目标的函数功能调用的表达式。我们可以输入如下命令:

print foo( sh_sci[current_sci]->smr.brg )

gdb就会将mr.brg的值传送给foo(),并报告其返回值。

当然,gdb也可以反汇编代码。只要可能的话,它还可以很好的为所需的数据提供等价的符号信息。例如,gdb用下列输出:

jmp 0x401010

告诉了我们,所显示的地址与从函数main()的起始地址起偏移80个字节的地址相等。

Gdb 可以显示其自身和所调试的目标间的远程串行调试信息,也可以将该信息记录到日志文件中去。这些特性对于我们调试一个新的stub,了解stub是如何使用远程串行协议来实现用户对数据、程序内存、系统调用等等的需求是十分有用的。

Gdb拥有脚本语言,允许对目标自动的设置和检测。该语言是对目标处理器独立的,所以应用程序从一个目标处理器移植到另外的处理器时,脚本可以重用。

最后,gdb还提供了跟踪点的功能,该功能可以记录某个运行程序的信息,而尽可能的不打断程序收集数据。跟踪点需要特别的调试stub来实现。

4.一个典型的gdb会话过程

现在我们已经探讨了gdb的通用功能,现在我们来看看gdb的执行。下面给出了一个典型的gdb 调试会话过程。在该过程中,gdb初始化了同一个运行调试stub的远端目标间的通信,然后下载程序,设置断点,并运行该程序。当遇到断点时,调试 stub通知gdb,gdb然后就将其源代码行显示给用户。接着,用户显示了一个变量,步近执行一个指令,然后推出gdb 。
请注意,下面并未显示用户在使用gdb时所见到的内容。用户所见到的是一个终端,显示的内容都是用英文写成的源代码、要显示的变量等等。但是,下面显示的脚本说明了当用户键入命令时在幕后发生的内容。

左边一栏显示了gdb控制台的一部分。在此用户键入命令并监视数据。右边一栏显示了一些使用GDB远程串行协议在宿主机和嵌入式设备之间的通信消息。在方括号中是一些解释信息。如果想清楚的了解这些信息的含义,请见附录《GDB远程串行协议》部分。

5.Gdb调试stub的源代码

虽然远程软件调试具有依赖于目标的特性,但是还是可以创建一个有高度的可移植性的调试stub,在不同的嵌入式处理器芯片之间可以被重用,而所需的修改最小。
有人已经尝试了这方面的工作。如果各位感兴趣,可以去上网查阅相关的资料。例如http://sourceforge.net/projects/gdbstubs。

处理器特定的代码包含在与处理器相关的文件名中,例如gdb_sh2*.c。我们可以针对我们特定的处理器下载相关的文件(例如gdb_m68k*.c),然后在用其替代我们机器上的相关内容。

6.关于改造gdb来解决特定问题的考虑

gdb使用了一个模块化的体系结构来实现,那么对它某些不适合我们需要的特性就可以很直接的加以处理。例如,如果我们的产品仅仅有一个通信端口,而它使用的并不是gdb的通信协议的话,那么,可以修改gdb,使得调试器的信息同我们产品已经使用的信息包相匹配。

类似地,如果我们的产品没有串行端口,而有些别的通信接口(例如CAN端口),那么我们可以加强gdb的远程通信功能,来适应该端口。

我们也可以修改gdb的工作方式使其同我们嵌入式应用程序更加的相容。例如,如果我们正在使用TRAPA #32来做些同gdb无关的工作,我们就可以改变gdb为了设置断点而使用的操作码,或者我们可以使用gdb来产生一个新的消息告诉我们的目标板开启指令追踪的功能或使能芯片内的断点产生硬件。

文件gdb/remote.c包含了gdb的远程串行协议的实现过程。对于研究gdb的模块化的实现是如何允许我们快速的将其改造以适应特定的调试目标而言,该文件是个很好的起点。其它的文件,例如gdb/remote-hms.c 和gdb/remote-e7000.c,使用了该模块化的结构来为诸如Hitachi, Motorola等公司的芯片的调试器和仿真器提供支持。

7.总结

gdb对于调试目标(包括对其内存的使用,通信媒介等等方面)的可适应性使得它对于目标板的调试而言,常常是唯一的选择。考虑到单芯片高集成度、基于 IP的嵌入式产品的普及,情况更是如此。在今天,嵌入式设备的复杂性与日俱增,在进行新的设计时,其供选择的技术的选择也越来越多,要找到一个商业的开发产品是越来越困难了。

而使用GNU工具将是个很好的选择。GNU工具对各种流行的嵌入式处理器的支持意味着,当我们正在使用的开发工具对我们将要在下一个设计中使用的处理器不支持时,我们可以减少寻找新的开发工具所带来的危险。

------解决方案--------------------
display/i $pc
打印出当前执行的汇编语句
------解决方案--------------------
disassemble 函数名
就能列出该函数的汇编代码
------解决方案--------------------
另外p/t 变量 是看变量的2进制 p/x 变量 查看变量16进制值
x命令是查看内在地址的值 比如:x/3uh 0x54320 表示,从内存地址0x54320读取内容,h表示以双字节为一个单位,3表示三个单位,u表示按十六进制显示

哎细节还有好多好多,功能很N很强大,经常使用也只是一小部分而已
------解决方案--------------------
保证调试的目录下有你的程序
cd 进入目录
ls 显示文件
gcc -g *.c -o test 
gdb test
.......

文章评论

10个调试和排错的小建议
10个调试和排错的小建议
亲爱的项目经理,我恨你
亲爱的项目经理,我恨你
程序员都该阅读的书
程序员都该阅读的书
团队中“技术大拿”并非越多越好
团队中“技术大拿”并非越多越好
“懒”出效率是程序员的美德
“懒”出效率是程序员的美德
那些争议最大的编程观点
那些争议最大的编程观点
做程序猿的老婆应该注意的一些事情
做程序猿的老婆应该注意的一些事情
科技史上最臭名昭著的13大罪犯
科技史上最臭名昭著的13大罪犯
我跳槽是因为他们的显示器更大
我跳槽是因为他们的显示器更大
看13位CEO、创始人和高管如何提高工作效率
看13位CEO、创始人和高管如何提高工作效率
“肮脏的”IT工作排行榜
“肮脏的”IT工作排行榜
Web开发者需具备的8个好习惯
Web开发者需具备的8个好习惯
程序员的鄙视链
程序员的鄙视链
为什么程序员都是夜猫子
为什么程序员都是夜猫子
 程序员的样子
程序员的样子
Web开发人员为什么越来越懒了?
Web开发人员为什么越来越懒了?
如何区分一个程序员是“老手“还是“新手“?
如何区分一个程序员是“老手“还是“新手“?
代码女神横空出世
代码女神横空出世
程序员和编码员之间的区别
程序员和编码员之间的区别
5款最佳正则表达式编辑调试器
5款最佳正则表达式编辑调试器
程序员眼里IE浏览器是什么样的
程序员眼里IE浏览器是什么样的
要嫁就嫁程序猿—钱多话少死的早
要嫁就嫁程序猿—钱多话少死的早
编程语言是女人
编程语言是女人
10个帮程序员减压放松的网站
10个帮程序员减压放松的网站
Java 与 .NET 的平台发展之争
Java 与 .NET 的平台发展之争
程序员必看的十大电影
程序员必看的十大电影
程序猿的崛起——Growth Hacker
程序猿的崛起——Growth Hacker
老程序员的下场
老程序员的下场
我是如何打败拖延症的
我是如何打败拖延症的
如何成为一名黑客
如何成为一名黑客
初级 vs 高级开发者 哪个性价比更高?
初级 vs 高级开发者 哪个性价比更高?
十大编程算法助程序员走上高手之路
十大编程算法助程序员走上高手之路
Java程序员必看电影
Java程序员必看电影
总结2014中国互联网十大段子
总结2014中国互联网十大段子
程序员周末都喜欢做什么?
程序员周末都喜欢做什么?
旅行,写作,编程
旅行,写作,编程
什么才是优秀的用户界面设计
什么才是优秀的用户界面设计
程序员应该关注的一些事儿
程序员应该关注的一些事儿
当下全球最炙手可热的八位少年创业者
当下全球最炙手可热的八位少年创业者
中美印日四国程序员比较
中美印日四国程序员比较
程序员的一天:一寸光阴一寸金
程序员的一天:一寸光阴一寸金
60个开发者不容错过的免费资源库
60个开发者不容错过的免费资源库
写给自己也写给你 自己到底该何去何从
写给自己也写给你 自己到底该何去何从
我的丈夫是个程序员
我的丈夫是个程序员
聊聊HTTPS和SSL/TLS协议
聊聊HTTPS和SSL/TLS协议
软件开发程序错误异常ExceptionCopyright © 2009-2015 MyException 版权所有