c – 为什么malloc / new会捕获callstack?

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

当我连接VS Profiler或windbg时,我看到很多像下面那样的callstack.我知道在调试器(或分析器)中产生的进程使用调试堆等…但事实并非如此,因为该服务是由OS启动的,我只附加到它.

我不明白它为什么要展开堆栈.分析器显示花费了大量时间.更多信息:

•这些是使用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

解决方法:

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

您应该能够使用info here在注册表中检查这种可能性.

上一篇:Python中的可变范围问题


下一篇:python – PyBluez不接受连接