首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >利用优化启用使Stack Walker在应用中工作

利用优化启用使Stack Walker在应用中工作
EN

Stack Overflow用户
提问于 2010-12-08 03:52:56
回答 2查看 679关注 0票数 2

我指的是http://www.wintoolzone.com/articles/AuthoringStackWalkerForX86.pdf的文章

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

在文章中,它提到:

”要求在生成的代码中显示堆栈帧指针。在没有堆栈帧指针的情况下,优化的代码将不会被此代码遍历。它作为读者在此代码基上实现它的练习。

我想知道,你们中的任何人都有一种便携的方式,可以在没有假设堆栈帧指针可用性的情况下,同时完成优化代码和未优化代码?

目前,上面的堆栈遍历示例正在对每个函数都进行假设。

代码语言:javascript
复制
push        ebp  
mov         ebp,esp

作为函数的第一行代码。

我曾经尝试过RtlCaptureStackBackTrace,但是它的限制高达62帧并不能达到我的目的。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2010-12-08 04:20:06

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

代码语言:javascript
复制
push        ebp  
mov         ebp,esp

而是假设ebp总是用作帧指针。这允许简单的堆栈展开:ebp指向最后保存的堆栈帧,上面的所有数据都是局部变量,堆栈上的下一个值是调用者的返回地址。很简单。

对于一个复杂的堆栈,您应该直接“转储”堆栈,尽可能多地说明每个值。这只是一种价值吗?寄信地址?函数的参数?或者是一根绳子?

若要检查dword是否为返回地址,可以对所有加载的模块进行enumarate,并获得具有执行权限的模块节的地址范围。(也许VirtualQuery也能做到)。

通过对每个模块执行“库存”,您可以获得所有导出符号的列表。这至少会给你一些名字。

票数 1
EN

Stack Overflow用户

发布于 2010-12-08 03:55:47

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4384008

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档