【问题标题】:Why do malloc/new capture the callstack?为什么 malloc/new 捕获调用堆栈?
【发布时间】:2012-12-18 05:58:23
【问题描述】:

我有一个在 Server 2003 下作为服务运行的 64 位应用程序。

当我附加 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

【问题讨论】:

    标签: c++ windows heap-memory callstack stack-unwinding


    【解决方案1】:

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

    您应该能够使用here 信息在注册表中检查这种可能性。

    【讨论】:

    • 非常感谢史蒂夫。确实如此。 GlobalFlags 在“图像文件执行选项”下的注册表中设置为 0x1000,这意味着“创建用户模式堆栈跟踪数据库”。再次感谢!
    • 太棒了,很高兴它被整理出来了——顺便说一句,如果你能把它关掉,一切都会运行得更快;-)
    • 是的。现在就这样做。很惊讶在 Google 或 Stackoverflow 上没有找到对它的引用。
    • 你正在开辟一条道路,同时加快了服务器的速度,这算得上是美好的一天……
    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-10-03
      • 2011-07-04
      • 2021-05-10
      • 2011-08-06
      • 2014-04-23
      • 1970-01-01
      • 1970-01-01
      • 2011-11-20
      相关资源
      最近更新 更多