【问题标题】:Going through the stack遍历堆栈
【发布时间】:2016-08-13 10:22:17
【问题描述】:

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

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 上,它给了我读取访问冲突。

这有什么问题?

【问题讨论】:

  • 您在调试器下运行代码时收集了哪些信息?具体来说,哪个表达式/语句因访问冲突而失败?
  • @IInspectable void* pointsTo = *((void**)address); 这是循环失败时的第一次迭代。

标签: c winapi x86 stack x86-64


【解决方案1】:

问题是你取消引用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*))

【讨论】:

    猜你喜欢
    • 2014-06-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-12
    • 2014-05-08
    • 2016-04-16
    • 2015-03-02
    • 1970-01-01
    相关资源
    最近更新 更多