我有一个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在注册表中检查这种可能性.