为什么malloc/new会捕获调用栈?

3

我有一个64位应用程序,在Server 2003下以服务形式运行。

当我附加VS Profiler或windbg时,我看到很多像下面这样的调用堆栈。我知道在调试器(或分析器)中生成的进程使用调试堆等...但是这不是情况,因为此服务由操作系统启动,我只是附加它。

我不明白为什么它会展开堆栈。并且分析器显示在这样做时花费了可观的时间。一些更多的信息:

• 这些是使用vc9构建的发布版本,在Server 2003上运行。

• 系统环境变量_NO_DEBUG_HEAP设置为1。

• 我正在使用Microsoft符号服务器。

为什么它要捕获堆栈跟踪?它似乎在记录它...但我找不到记录的地方。

我的目标是验证该应用程序是否真的展开了堆栈,如果是,则尝试避免展开。

有任何想法吗?


调用堆栈

ntdll!RtlVirtualUnwind
ntdll!RtlpWalkFrameChain
ntdll!RtlCaptureStackBackTrace
ntdll!RtlpCaptureStackTraceForLogging
ntdll!RtlLogStackBackTrace
ntdll!RtlDebugAllocateHeap
ntdll!RtlAllocateHeapSlowly
ntdll!RtlAllocateHeap
MSVCR90!malloc
MSVCR90!operator new
2个回答

8

有可能有人使用gflags.exe来启用用户堆栈跟踪捕获该进程或系统范围内,或者某些其他需要跟踪CRT分配操作的标志。

您可以使用此处提供的信息在注册表中检查此可能性here


非常感谢Steve。确实是这种情况。 GlobalFlags在注册表中的“Image File Execution Options”下被设置为0x1000,这意味着“创建用户模式堆栈跟踪数据库”。 再次感谢! - Benedetto
太好了,很高兴问题解决了 - 顺便说一句,如果你能关闭这个,所有的东西都会运行得更快 ;-) - Steve Townsend
是的,我正在做这件事。惊讶的是在谷歌或Stackoverflow上没有找到相关的参考。 - Benedetto
你正在开创先河并加速服务器,这算是一个不错的一天... - Steve Townsend

0

Steve的回答很好,最终在经过漫长的调查后解决了我们自己服务器上的问题。我们的情况略有不同,堆栈捕获的原因是由于一个脚本定期运行UMDH捕获。当第一次针对该进程执行UMDH时,它将启用堆栈收集。它会给出以下警告:

 UMDH has enabled allocation stack collection for the current running process.

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接