打印堆栈指针的值

新手上路,请多包涵

如何在 Linux(Debian 和 Ubuntu)中打印出 C 中堆栈指针的当前值?

我尝试了谷歌但没有找到任何结果。

原文由 Juicy 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 701
2 个回答

一个不可移植甚至不能保证工作的技巧是简单地将本地地址作为指针打印出来。

 void print_stack_pointer() {
  void* p = NULL;
  printf("%p", (void*)&p);
}

这实际上将打印出 p 的地址,这是当前堆栈指针的一个很好的近似值

原文由 JaredPar 发布,翻译遵循 CC BY-SA 3.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 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题