如何在 Linux(Debian 和 Ubuntu)中打印出 C 中堆栈指针的当前值?
我尝试了谷歌但没有找到任何结果。
原文由 Juicy 发布,翻译遵循 CC BY-SA 4.0 许可协议
没有便携的方法可以做到这一点。
在 GNU C 中,这可能适用于具有名为 SP 的寄存器的目标 ISA,包括 x86,其中 gcc 将“SP”识别为 ESP 或 RSP 的缩写。
// broken with clang, but usually works with GCC
register void *sp asm ("sp");
printf("%p", sp);
GCC 现在不推荐使用 本地寄存器变量 的这种用法:
此功能唯一受支持的用途是在调用 扩展 asm 时为输入和输出操作数指定寄存器
定义寄存器变量不会保留寄存器。除了调用扩展 asm 时,不保证指定寄存器的内容。因此,明确不支持以下用途。 如果它们似乎起作用,那只是偶然,并且可能由于周围代码的(看似)不相关的更改,甚至是未来版本 gcc 优化中的微小更改而停止按预期工作。 …
在实践中它也被 clang 打破,其中 sp
被视为任何其他未初始化的变量。
原文由 duedl0r 发布,翻译遵循 CC BY-SA 4.0 许可协议
7 回答5.3k 阅读
4 回答4k 阅读
2 回答5.9k 阅读✓ 已解决
2 回答2.5k 阅读✓ 已解决
1 回答2.3k 阅读✓ 已解决
2 回答800 阅读✓ 已解决
1 回答3.3k 阅读
一个不可移植甚至不能保证工作的技巧是简单地将本地地址作为指针打印出来。
这实际上将打印出
p
的地址,这是当前堆栈指针的一个很好的近似值