stackwalk

本文详细分析了在32位Windows 7系统使用stackwalk工具时调用堆栈数量减少的问题,并指出在32位XP系统上表现正常的原因。建议使用stackwalk64解决此问题。

在32位的windows7系统 stackwalk得到的调用堆栈(frame)个数少。

改用stackwalk64是正确的。

为什么同样代码在32位xp上管用,32位windows7上有问题?

我用错了?


http://blogs.msdn.com/b/ntdebugging/


VC++ (Visual C++) 提供了一种叫做`StackWalk64`的功能,用于调试程序时获取当前的调用堆栈(Call Stack)。这是一个底层API,通常在需要深入分析异常堆栈、函数调用顺序或执行线程等复杂情况时使用。 `StackWalk64`是一个系列的回调函数,你需要提供一个回调函数指针,当遍历堆栈帧时,这个函数会被调用,你可以从中获取每个帧的信息,如模块名、文件名、行号和函数地址。以下是使用`StackWalk64`的基本步骤: 1. 包含头文件:首先包含`DbgHelp.h`,它包含了`SymFromAddr`和`StackWalk64`等函数声明。 ```cpp #include <DbgHelp.h> ``` 2. 定义回调函数:创建一个实现了`PfnMiniDumpReadMemory`和`PfnMiniDumpWriteMemory`的结构体,这两个函数会在遍历过程中读取和写入内存。 3. 初始化:设置`MINIDUMP_LOCATION_INFORMATION`和`STACKFRAME64`结构,以及`SymFunctionTableAccess64`和`SymGetModuleInfo64`的回调函数。 4. 调用`StackWalk64`:传入堆栈信息、回调函数、进程句柄和内存dump的信息,开始遍历堆栈。 ```cpp void CALLBACK StackWalkCallback( MINIDUMP_USER_STREAM_INFORMATION StreamType, ULONG64 AddressOfRawData, ULONG64 DataSize, void* UserContext, PMINIDUMP_CALLBACK_INFORMATION CallbackInformation) { // 在这里处理每个堆栈帧的信息... } // 使用 MDIStreamHeader streamHeader; if (MiniDumpReadProcessMemory(hProcess, &streamHeader, sizeof(MDIStreamHeader), &streamHeader, NULL)) { StackWalk64(MiniDumpWalkOptions, hProcess, hThread, &streamHeader, &callbackInfo, pUserContext); } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值