在有源代码的情况下,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是将执行未执行的那一条指令.
阅读(1364) | 评论(0) | 转发(0) |