c - 遍历堆栈

标签 c winapi x86 stack x86-64

我做了一个简单的函数来遍历整个堆栈并打印出其中每个条目的内容。

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/

相关文章:

c - C 程序中设置的预处理器指令值

winapi - ERROR_PENDING 在哪里定义?

c# - 更改外部窗口的最小尺寸

assembly - 在 DDD 中解释 eFlags

x86 - 使用 AVX512 生成蒙版的 BMI

assembly - 错误 a2070 指令操作数无效

c - 运行 Redis 的大量 TIME_WAIT 套接字连接

c - 在 C 中记录错误

c++ - 从图像中提取缩略图的最快方法是什么?

c - 二进制检测或二进制代码中的图像和例程是什么?