是否可以根据函数即将返回的函数在函数末尾设置条件断点?

时间:2009-09-04 11:08:57

标签: debugging gdb return-value

我有以下更复杂的版本:

unsigned int foo ();
unsigned int bar ();

unsigned int myFunc () {
  return foo()+bar();
}

就我而言,很多地方都会调用myFunc。在其中一个背景下出现了问题。我知道从调试中进一步知道当事情不好时这个函数的返回值是什么,但不幸的是我不知道这个值产生了什么路径。

我可以添加一个临时变量来存储表达式“foo()+ bar()”的结果,然后在该值上添加条件断点,但我想知道是否可以用其他方式来做。

我正在研究x86架构。

thisthis回答我认为我可以在函数返回的确切位置设置断点:

gdb> break *$eip

然后根据$ eax寄存器添加条件断点,但至少在我的测试中,返回不在此寄存器中。

这可能吗?

2 个答案:

答案 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中,一旦设置断点,右键单击它并单击“条件...”选项以获得对话框似乎可以让您编辑断点的条件。

希望这有帮助! : - )