c++ - 为什么 malloc/new 捕获调用堆栈?

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

我有一个在 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

最佳答案

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

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

关于c++ - 为什么 malloc/new 捕获调用堆栈?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14146254/

相关文章:

C - Windows 输入重定向与 getchar 不起作用?

C Keil 编译器使用 malloc 作为局部变量,为什么?

c - 内存分配 **p

c++ - 使用 Boost 序列化双端队列 vector 的问题

c++ - 在公共(public)接口(interface)中使用共享指针

java - 如何在没有管理权限的情况下更改类路径

c - 它在栈上还是堆上?

c++ - std::chrono::from_stream 可以以微秒精度将字符串转换为 time_point 吗?

c++ - 在 C++ 中写入文件的编译错误

windows - Win32 CreateProcess : When is CREATE_UNICODE_ENVIRONMENT *really* needed?