首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何访问MFC8.0应用程序中恶意代码的完整堆栈跟踪?

如何访问MFC8.0应用程序中恶意代码的完整堆栈跟踪?
EN

Stack Overflow用户
提问于 2009-07-15 11:56:43
回答 2查看 1.2K关注 0票数 0

我试图在WindowsMFC8.0应用程序(Release )中发现内存泄漏。

在由于WinDbg (或umdh)未能显示使用VC8 FPO中CRT的malloc问题的分配的完整堆栈跟踪之后,我尝试应用提议的解决方案这里 (即使用启用DbgHlp StackWalk的LeakDiag ),但只意识到LeakDiag在监视C运行时分配程序时不会生成日志文件,但是,当监视Windows分配程序时,它会工作,但是堆栈跟踪会在malloc调用时结束。

符号是正确配置的,因为我可以在生成的文件中看到函数名、文件名、行等。

有人知道为什么我不能记录C运行时分配程序吗?以及为什么即使我使用DbgHlp StackWalk API也无法获得完整的堆栈跟踪?

如果你能给我任何提示,我将不胜感激。

附加信息:

我的堆栈跟踪是什么样的:

我使用WinDbg实现了这一点。该地址是堆-l报告为泄漏块的地址之一。

代码语言:javascript
运行
复制
0:000> !heap -p -a 25b18400  
address 25b18400 found in
_HEAP @ 2a70000
  HEAP_ENTRY Size Prev Flags    UserPtr UserSize - state
    25b183f8 0008 0000  [07]   25b18400    00021 - (busy)
    Trace: 00a4
    7c97d6dc ntdll!RtlDebugAllocateHeap+0x000000e1
    7c959d18 ntdll!RtlAllocateHeapSlowly+0x00000044
    7c92b298 ntdll!RtlAllocateHeap+0x00000e64
    78134d83 MSVCR80!malloc+0x0000007a
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2009-08-06 10:26:00

你为什么不使用第三方工具呢?

即下载一份情报平行检查员的评估副本。它非常简单地安装并运行在现有的发行版构建上。它显示-在大多数情况下-一个完整的堆栈(我很肯定,虽然它也发现一些假阳性)。

从配置管理器中选择发布版本,并确保它创建一个pdb文件(在链接器选项中)。然后启动“检查内存错误”。

还有许多其他类似的工具: AQTime、GlowCode。所有这些都不需要重新编译或检测。

票数 1
EN

Stack Overflow用户

发布于 2009-08-04 22:26:30

有人知道为什么我不能记录C运行时分配程序吗?

你在用Debug构建?Debug CRT有自己的堆检查,它击败了UMDH和其他在全局OS堆上操作的工具。确保在使用UMDH和朋友时关闭了所有MFC和MSVCRT堆调试功能。

也可能是您,或者在您的过程中,更改小块分配器的阈值。从默认的0。

否则,8.0版本的CRT应该将请求转发到全局堆,这正是堆调试工具所需要的。

以及为什么即使我使用DbgHlp StackWalk API也无法获得完整的堆栈跟踪?

我认为Skywing在你给出的链接中很好地描述了细节。仅仅为了重新迭代,他可能低估了一点的部分是“在x86上,‘完美’堆栈跟踪通常是不可能的,因为没有元数据附加到描述如何通过它的特定函数(调试符号之外)。”对于DbgHlp来说,使用EBP作为划痕寄存器来解压一个函数(比如MSVCRT的malloc)是非常不切实际的。

当然,您可以从更正的源重新构建自己的CRT,或者尝试替换CRT /free。

实际上,我认为您最好的做法是在x64平台上复制漏洞,在该平台上,堆栈解除保证是相当可靠的。

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

https://stackoverflow.com/questions/1130966

复制
相关文章

相似问题

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