gpt4 book ai didi

c++ - 这总是 GDB 调试程序的地址吗?

转载 作者:行者123 更新时间:2023-11-28 03:46:09 25 4
gpt4 key购买 nike

我会缩小我的问题范围:

对于同一个程序,GDB 中的入口地址保持不变(即使在重新启动和重写源代码之后)。

这是为什么?

例如0x80483f4是起始地址。

**0x80483f4** <main()>              push   %ebp                                │
│0x80483f5 <main()+1> mov %esp,%ebp │
│0x80483f7 <main()+3> sub $0x10,%esp │
│0x80483fa <main()+6> movl $0x3,-0x4(%ebp) │
│0x8048401 <main()+13> movl $0x3,-0x8(%ebp) │
│0x8048408 <main()+20> mov $0x0,%eax │
│0x804840d <main()+25> leave │
│0x804840e <main()+26> ret

除此之外,我们从 0x80483fa 获得的值始终相同。

$2 = 0x80483fa <main()+6>
(gdb) x $2
0x80483fa <main()+6>: 0x3fc45c7
(gdb) p 0x3fc45c7
$3 = 66864583 <-- even after reboot.

这对我有何启示?
我对每次赋值前后的值感兴趣(稍后说 c = a+b ),而不使用断点一次单步执行一行。

源代码:

int main()
{
int b = 3;
int a = 3;
return 0;
}

有人可以给我解释一下吗?谢谢。(我也会将其标记为家庭作业,尽管它确实不是。)

最佳答案

For example 0x80483f4 is the starting address.

这很有可能。除非你有 PIE(与位置无关的可执行文件),否则它将永远保持不变(对于一个二进制文件)。

$2 = 0x80483fa <main()+6>
(gdb) x $2
0x80483fa <main()+6>: 0x3fc45c7

这是 main()+6 指令的二进制表示。永远不会在一个二进制文件中改变。

(gdb) p 0x3fc45c7
$3 = 66864583 <-- even after reboot.

这意味着 0x3fc45c7 是十进制的 66864583...

请注意,这与 ab 没有任何关系。

顺便说一句,“赋值前”获取变量值的最佳方法是在赋值前printf它们。

关于c++ - 这总是 GDB 调试程序的地址吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7623696/

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