gpt4 book ai didi

c++ - 使 Stack Walker 在启用优化的应用程序中工作

转载 作者:可可西里 更新时间:2023-11-01 10:40:08 35 4
gpt4 key购买 nike

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

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

文章中提到:

"Requires stack frame pointer to be present in the produced code. Optimized code where stack frame pointer is absent will not be walked by this code. Its left as an exercise for the reader to implement it over this codebase."

我想知道,你们中的任何人都有一种可移植的方式来遍历优化和未优化的代码,而不假设堆栈帧指针的可用性?

目前,上面的堆栈遍历器示例正在假设每个函数都具有

push        ebp  
mov ebp,esp

作为函数代码的第一行。

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

最佳答案

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

push        ebp  
mov ebp,esp

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

对于复杂的,您应该直接“转储”堆栈,尝试尽可能多地说明每个值。它只是一个值吗?回邮地址?函数的参数?或者可能是一个字符串?

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

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

关于c++ - 使 Stack Walker 在启用优化的应用程序中工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4384008/

35 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com