gpt4 book ai didi

c++ - 如何在函数返回的 GDB 中设置断点?

转载 作者:IT老高 更新时间:2023-10-28 21:44:14 24 4
gpt4 key购买 nike

我有一个 C++ 函数,它在不同的地方有许多返回语句。如何在函数实际返回的return语句处设置断点?

不带参数的“break”命令是什么意思?

最佳答案

与到目前为止的答案相反,大多数编译器都会创建一条返回汇编指令,无论函数中有多少 return 语句(编译器这样做很方便,所以有只有一个地方来执行所有的堆栈帧清理)。

如果您想停止该指令,您所要做的就是 disas 并查找 retq(或任何处理器的返回指令),然后在上面设置断点。例如:

int foo(int x)
{
switch(x) {
case 1: return 2;
case 2: return 3;
default: return 42;
}
}

int main()
{
return foo(0);
}


(gdb) disas foo
Dump of assembler code for function foo:
0x0000000000400448 <+0>: push %rbp
0x0000000000400449 <+1>: mov %rsp,%rbp
0x000000000040044c <+4>: mov %edi,-0x4(%rbp)
0x000000000040044f <+7>: mov -0x4(%rbp),%eax
0x0000000000400452 <+10>: mov %eax,-0xc(%rbp)
0x0000000000400455 <+13>: cmpl $0x1,-0xc(%rbp)
0x0000000000400459 <+17>: je 0x400463 <foo+27>
0x000000000040045b <+19>: cmpl $0x2,-0xc(%rbp)
0x000000000040045f <+23>: je 0x40046c <foo+36>
0x0000000000400461 <+25>: jmp 0x400475 <foo+45>
0x0000000000400463 <+27>: movl $0x2,-0x8(%rbp)
0x000000000040046a <+34>: jmp 0x40047c <foo+52>
0x000000000040046c <+36>: movl $0x3,-0x8(%rbp)
0x0000000000400473 <+43>: jmp 0x40047c <foo+52>
0x0000000000400475 <+45>: movl $0x2a,-0x8(%rbp)
0x000000000040047c <+52>: mov -0x8(%rbp),%eax
0x000000000040047f <+55>: leaveq
0x0000000000400480 <+56>: retq
End of assembler dump.
(gdb) b *0x0000000000400480
Breakpoint 1 at 0x400480
(gdb) r

Breakpoint 1, 0x0000000000400480 in foo ()
(gdb) p $rax
$1 = 42

关于c++ - 如何在函数返回的 GDB 中设置断点?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3649468/

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