gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 01:36:54 25 4
gpt4 key购买 nike

我有以下更复杂的版本:

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

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

就我而言, myFunc从很多地方调用。在其中一种情况下,出了点问题。我通过进一步调试知道当事情不好时这个函数的返回值是什么,但不幸的是我不知道导致这个值的路径是什么。

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

我正在研究 x86 架构。

来自 thisthis我以为我可以在函数返回的确切位置设置断点:
gdb> break *$eip

然后添加一个基于 $eax 寄存器的条件断点,但至少在我这里的测试中,返回值不在这个寄存器中。

这可能吗?

最佳答案

同意之前的评论者的观点,这可能是您不想做的事情,但对我来说,在 $eax(或 $rax,如果您使用的是 64 位 x86)的最后一条指令处设置条件断点效果很好。

对于代码

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)

关于debugging - 是否可以根据函数即将返回的内容在函数末尾设置条件断点?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1378594/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com