C++ 使Stack Walker在应用程序中工作并启用优化

C++ 使Stack Walker在应用程序中工作并启用优化,c++,windows,debugging,assembly,C++,Windows,Debugging,Assembly,我指的是在 我正在使用VC++2008。我意识到,当我将优化设置为“最大速度(/O2)”时,即使我将“忽略帧指针”显式设置为“否”,通过堆栈帧指针获取函数返回的地址也不会正常工作 文章中提到: “需要将堆栈帧指针 出现在生成的代码中。 优化了堆栈帧所在的代码 指针不在将不会被移动 根据这个密码,左边是一个练习 让读者在上面实现它 这个代码库。” 我想知道,你们中有谁有一种可移植的方法,可以在不假设堆栈帧指针的可用性的情况下遍历优化和未优化的代码 目前,上面的stack walker示例假设每个函

我指的是在

我正在使用VC++2008。我意识到,当我将优化设置为“最大速度(/O2)”时,即使我将“忽略帧指针”显式设置为“否”,通过堆栈帧指针获取函数返回的地址也不会正常工作

文章中提到:

“需要将堆栈帧指针 出现在生成的代码中。 优化了堆栈帧所在的代码 指针不在将不会被移动 根据这个密码,左边是一个练习 让读者在上面实现它 这个代码库。”

我想知道,你们中有谁有一种可移植的方法,可以在不假设堆栈帧指针的可用性的情况下遍历优化和未优化的代码

目前,上面的stack walker示例假设每个函数都有

push        ebp  
mov         ebp,esp
作为函数代码的第一行


我曾经尝试过
RtlCaptureStackBackTrace
,但它最多只能限制62帧,这不符合我的目的。

堆栈遍历应该可以正常工作,但是一些函数调用可能已经被优化(如内联和尾部调用)完全消除,因此,它们当然不会出现在调用堆栈中。

我想它的主要假设不是模式

push        ebp  
mov         ebp,esp
而是假定
ebp
始终用作帧指针。这允许简单的堆栈展开:
ebp
指向上次保存的堆栈帧,它上面的所有数据都是本地数据,堆栈上的下一个值是调用方的返回地址。简单

对于复杂的堆栈,您应该以文字形式“转储”堆栈,尽可能多地告诉每个值。这只是一个价值吗?回信地址?函数的参数?或者是一根绳子

要检查dword是否为返回地址,您可以枚举所有加载的模块,并获得其具有执行权限的部分的地址范围。(也许
VirtualQuery
也能做到这一点)


通过对每个模块执行“清点”,可以获得所有导出符号的列表。这将至少为您提供一些名称。

Windows提供的堆栈遍历功能工作正常,请参阅