在Linux(Debian和Ubuntu)中如何在C中的堆栈指针打印出当前值?
我试过谷歌,但没有find结果。
一个不可移植或者甚至不能保证工作的技巧是简单地将本地地址作为指针打印出来。
void print_stack_pointer() { void* p = NULL; printf("%p", (void*)&p); }
这将基本上打印出p
的地址,这是当前堆栈指针的一个很好的近似值
没有可移植的方式来做到这一点。
如果你想要一个gcc / x86的解决方案,你可以使用这个:
register int sp asm ("sp"); printf("%x", sp);
除了duedl0r的具体GCC 的答案 ,你可以使用__builtin_frame_address(0)
这是GCC特定的(但不是特定于x86 )。
这也应该在叮当 (但有一些错误 )。
以一个本地的地址(如JaredPar的回答 )也是一个解决方案。
请注意,AFAIK C标准理论上不需要任何调用堆栈。
记住Appel的论文: 垃圾回收可以比堆栈分配更快 ; 一个非常奇怪的C实现可以使用这样的技术! 但是AFAIK从来没有用过C.
人们可以梦想其他技术。 而且你可以分割堆栈 (至少在最近的GCC上),在这种情况下,堆栈指针的概念就没有多少意义了(因为堆栈不是连续的,可以由多个调用帧组成) 。
在Linux
您可以使用proc
伪文件系统来打印堆栈指针。
看看这里 ,在/ proc / your-pid / stat伪文件中,在字段29
。
startstack%lu堆栈的开始地址(即底部)。
kstkesp%lu ESP(堆栈指针)的当前值,在进程的内核堆栈页面中找到。
你只需要解析这两个值!
例如,你也可以使用扩展的汇编指令
#include <stdint.h> uint64_t getsp( void ) { uint64_t sp; asm( "mov %%rsp, %0" : "=rm" ( sp )); return sp; }
对于32位系统64,必须用32和rsp替换为esp