Chinaunix首页 | 论坛 | 博客
  • 博客访问: 2315189
  • 博文数量: 527
  • 博客积分: 10343
  • 博客等级: 上将
  • 技术积分: 5565
  • 用 户 组: 普通用户
  • 注册时间: 2005-07-26 23:05
文章分类

全部博文(527)

文章存档

2014年(4)

2012年(13)

2011年(19)

2010年(91)

2009年(136)

2008年(142)

2007年(80)

2006年(29)

2005年(13)

我的朋友

分类: LINUX

2010-05-13 10:34:21

在有源代码的情况下,gcc -g 之后产生的文件用gdb调试, 可以直接在源代码行上设置断点, 但有一种情况, 原始的
break *0x8064f11
具有特殊的用途:

在典型的C程序中, 还是有这样一种写法: 在一个函数中有多处return, 这不符合单入单出的简单原则, 但这种原则现今是有争议的, 如C++程序中因异常的缘故, 即使你没有显式return, 程序也会有多个看不见的出口.

上面的情况不说, 如果返回值为BOOL, 而函数中有多处return FALSE, return TRUE混杂, 如果希望在该函数返回之前设置一个断点, 用commands # 写一个printf 来显示感兴趣的内容, 需要找出多处return 语句, 每一个地方都要设置一个断点, 对每个断点又都要执行同样的调试命令.

这种情况下, 在leave + ret指令前设置一个单个的断点可以起到这种以一当十的效果, 这需要先反汇编该函数:
disassemble function_name
观察函数的退出指令, 有时是 leave + ret, 有时却是调整esp, ebp寄存器内容, 断点要设置在这些代码执行之前, 这样才可以访问完整的栈内容.

   0x08064f04 <+901>:   mov    DWORD PTR [ebp-0x18],0x1
   0x08064f0b <+908>:   mov    eax,DWORD PTR [ebp-0x18]
   0x08064f0e <+911>:   mov    ebx,DWORD PTR [ebp-0x4]
   0x08064f11 <+914>:   leave
   0x08064f12 <+915>:   ret
End of assembler dump.


对于上面的反汇编内容, 要设置
b *0x08064f11
断点断住的时候, leave是将执行未执行的那一条指令.
阅读(1300) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~