如何查找程序堆栈内存的起始和结束地址?

时间:2017-07-19 10:19:48

标签: c

任何人都可以解释如何通过编程找到堆栈起始地址和结束地址

1 个答案:

答案 0 :(得分:1)

没有可移植的方法来获取堆栈基数和C中的限制只是因为C不理解调用堆栈。

我们可以讨论使用堆栈进行调用的特定实现。

现在每个实现都使用某个寄存器指向的某种线程本地存储。在X86上,他们使用一个未使用的段寄存器。 这些实现还提供了一种访问此TLB的方法。

如果您在Windows上,可以查看NtCurrentTEB

TEB Structure。你可以看到字段 - StackBase和StackLimit。

用于获取堆栈基数和C限制的代码(类似可以用CPP编写)(仅限Windows)

#include <windows.h>
#include <winnt.h>

struct _TEB {
        NT_TIB NtTib;
};

void *getStackBase(){
        return NtCurrentTeb()->NtTib.StackBase;
}
void *getStackLimit(){
        return NtCurrentTeb()->NtTib.StackLimit;
}