gdb调试实例.docVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
gdb调试实例

1. 查看gdb命令 2 2. 程序堆栈布局 3 3. 调试演示 5 a) 堆栈信息 5 b) 调试多进程 6 c) 无效的内存地址 7 d) 不对齐的内存地址 8 e) 缓冲区溢出 9 f) 堆栈溢出 10 4. 调试原理 调试信息 14 a) 调试原理 14 b) 调试信息 14 frame的组成:在函数的入口处,首先保存那些在本函数里被使用的寄存器(D),函数退出时,恢复它们,其中就包含函数调用的返回地址,然后给函数内的局部变量分配空间(C),再然后给alloca调用或者动态数组分配空间(B),如果有调用子函数,而且子函数的参数个数过多,无法完全通过寄存器传递,那么就需要借助堆栈传递(A)。 函数出口处,堆栈释放是分配的逆过程,A--B--C--D,在D中得到函数的返回地址,于是当前函数调用完成,返回到调用它的上一级函数体内。 补充说明:不是每个函数的frame都包含ABCD,可能只包含一部分,比如只有CD,分配的时候D--C,释放的时候C--D,这个过程是完全对称的。 push 寄存器保存到桟里,局部变量分配桟空间,其他临时桟空间使用的分配 pop 从桟里恢复寄存器,局部变量释放桟空间,其他临时桟空间使用的释放 红色箭头 子函数调用 绿色箭头 从子函数调用返回 蓝色箭头 函数内部指令执行 图中反映了三个函数之间的调用关系,函数入口处压桟,函数出口处退桟,对于A,B,C可能在函数执行过程中发生,不一定在函数的入口处,比如程序在某个if语句块里定义的局部变量。我们在利用堆栈信息反推函数调用时,通过递增当前的堆栈指针,模拟函数调用返回的过程,就可以知道每个函数的stack frame范围,从中提取需要的信息,比如获取返回地址的值,就知道当前函数的上一级函数是谁,重复此过程便可以推出完整的函数调用关系。 3. 调试演示 a) 堆栈信息 盒子端:gdbserver 192.168.111.114:1234 ./testcases 0 192.168.111.114是盒子的ip地址 1234是盒子端用于调试的端口号,电脑端连接时参数就要指定这个端口 ./testcases 被调试的程序 0 参数,传递给testcases,共6个测试项,对应0~5 电脑端:sh4-linux-uclibc-gdb (gdb) set solib-absolute-prefix /mnt/sdb/PRJ/Hathway_STH273/nfs/ //共享库的查找路径 (gdb) file testcases // 指定调试对象 Reading symbols from /home/wucong/gdb/testcases...done. (gdb) target remote 192.168.111.114:1234 // 盒子的地址以及调试端口号 Remote debugging using 192.168.111.114:1234 Reading symbols from /mnt/sdb/PRJ/Hathway_STH273/nfs/lib/ld-uClibc.so.0...(no debugging symbols found)...done. Loaded symbols for /mnt/sdb/PRJ/Hathway_STH273/nfs/lib/ld-uClibc.so.0 0in _start () from /mnt/sdb/PRJ/Hathway_STH273/nfs/lib/ld-uClibc.so.0 (gdb) b dump Breakpoint 1 at 0x4006c0: file testcases.c, line 7. (gdb) c Continuing. Breakpoint 1, dump (a=0, b=1, c=2, d=3, e=4, f=5) at testcases.c:7 7 printf(dump %d %d %d %d %d %d\n, a, b, c, d, e, f); (gdb) bt #0 dump (a=0, b=1, c=2, d=3, e=4, f=5) at testcases.c:7 // stack frame #1 0in testcase0 () at testcases.c:12 // stack frame #2 0x004008e0 in main (argc=2, argv=0x7bd10e74) at testcases.c:87 // stack frame (gdb) disassemble testcase0 // 反汇编 Dump of as

文档评论(0)

gk892289 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档