2016-04-20 31 views
1

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

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

这是怎么回事?

+0

你收集哪些信息的调试器下运行的代码?具体来说,哪个表达式/语句在访问冲突时失败? – IInspectable

+0

@IInspectable'void * pointsTo = *((void **)address);' 这是循环失败时的第一次迭代。 – man

回答

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*))