我有以下更复杂的版本:
unsigned int foo ();
unsigned int bar ();
unsigned int myFunc () {
return foo()+bar();
}
就我而言,很多地方都会调用myFunc
。在其中一个背景下出现了问题。我知道从调试中进一步知道当事情不好时这个函数的返回值是什么,但不幸的是我不知道这个值产生了什么路径。
我可以添加一个临时变量来存储表达式“foo()+ bar()”的结果,然后在该值上添加条件断点,但我想知道是否可以用其他方式来做。
我正在研究x86架构。
从this和this回答我认为我可以在函数返回的确切位置设置断点:
gdb> break *$eip
然后根据$ eax寄存器添加条件断点,但至少在我的测试中,返回不在此寄存器中。
这可能吗?
答案 0 :(得分:5)
同意之前的评论者,这可能是你不想做的事情,但对我来说,在$ eax的最后一条指令上设置一个条件断点(如果你在64位x86上,则为$ rax)只能工作精细。
代码
unsigned int foo(void) { return 1; }
unsigned int bar(void) { return 4; }
unsigned int myFunc(void) { return foo()+bar(); }
使用gdb ..
(gdb) disass myFunc
Dump of assembler code for function myFunc:
0x080483d8 <myFunc+0>: push %ebp
0x080483d9 <myFunc+1>: mov %esp,%ebp
0x080483db <myFunc+3>: push %ebx
0x080483dc <myFunc+4>: call 0x80483c4 <foo>
0x080483e1 <myFunc+9>: mov %eax,%ebx
0x080483e3 <myFunc+11>: call 0x80483ce <bar>
0x080483e8 <myFunc+16>: lea (%ebx,%eax,1),%eax
0x080483eb <myFunc+19>: pop %ebx
0x080483ec <myFunc+20>: pop %ebp
0x080483ed <myFunc+21>: ret
End of assembler dump.
(gdb) b *0x080483ed if $eax==5
Breakpoint 1 at 0x80483ed
(gdb) run
Starting program: /tmp/x
Breakpoint 1, 0x080483ed in myFunc ()
(gdb)
答案 1 :(得分:0)
我不知道你是否从命令行编译,但是在Visual Studio中,一旦设置断点,右键单击它并单击“条件...”选项以获得对话框似乎可以让您编辑断点的条件。
希望这有帮助! : - )