我做了一个简单的函数来遍历整个堆栈并打印出其中每个条目的内容。
void ListStack()
{
NT_TIB* tib = (NT_TIB*)NtCurrentTeb();
for (void* address = tib->StackBase; address > tib->StackLimit; address = (char*)address - sizeof(void*))
{
void* pointsTo = *((void**)address);
printf("address=%p, points to=%p\n", address, pointsTo);
}
}
在 x86 上,这工作正常。但是,在 x64 上,它会导致读取访问冲突。
这有什么问题吗?
最佳答案
问题是您正在取消引用 tib->StackBase
。
堆栈区域大于或等于 tib->StackLimit
且小于 tib->StackBase
。很可能包含tib->StackBase
的页面不会被映射到内存中。
所以只需将您的 for 循环更改为如下所示:
for (void* address = (char*)tib->StackBase - sizeof(void*);
address >= tib->StackLimit;
address = (char*)address - sizeof(void*))
关于c - 遍历堆栈,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36748888/