【问题标题】:Why don't you get full stack traces when enabling the user mode stack trace?为什么启用用户模式堆栈跟踪时没有获得完整的堆栈跟踪?
【发布时间】:2011-11-11 11:35:05
【问题描述】:

我正在对一些内存碎片问题进行故障排除,并且一直在试图弄清楚为什么要分配事物以及最终由谁进行分配。所以我为进程启用了用户模式堆栈跟踪(gflags 中的 +UST 标志)并得到了转储。当我分析转储并使用 !heap -p -a Some_Address 时。我看到了一个堆栈跟踪,但它肯定不是一个完整的跟踪。我通常只在跟踪中看到 4-7 个函数,然后它就停止了。堆栈中没有报告错误,但不幸的是它没有足够的信息。我检查了一堆分配,它们似乎都有同样的问题。我认为这可能是堆栈数据库的大小,但我本以为会丢失整个条目,而不仅仅是丢失其中的一部分。我可以做些什么来增加可视堆栈的总大小。下面是我看到的堆栈的一些示例。

0:000> !heap -p -a 3cb49008
    address 3cb49008 found in
    _HEAP @ 80000
      HEAP_ENTRY Size Prev Flags    UserPtr UserSize - state
        3cb49000 0fdd 0000  [07]   3cb49008    07ed0 - (busy)
        Trace: 6b69
        7c855014 ntdll!RtlAllocateHeapSlowly+0x00000041
        7c83d9aa ntdll!RtlAllocateHeap+0x00000e9f
        776bcfce ole32!CRetailMalloc_Alloc+0x00000016
        77d0404a oleaut32!APP_DATA::AllocCachedMem+0x0000004f
        77d04341 oleaut32!SysAllocStringByteLen+0x0000003c
        77d03f9b oleaut32!ErrStringCopyNoNull+0x00000016
        77d0456f oleaut32!VariantCopy+0x0000007e
        3ff1946 xxxx!_variant_t::_variant_t+0x00000016


0:000> !heap -p -a 2774cfc8
    address 2774cfc8 found in
    _HEAP @ 3cc0000
      HEAP_ENTRY Size Prev Flags    UserPtr UserSize - state
        2774cfc0 0008 0000  [17]   2774cfc8    00020 - (busy)
        Trace: 7de8
        7c855014 ntdll!RtlAllocateHeapSlowly+0x00000041
        7c83d9aa ntdll!RtlAllocateHeap+0x00000e9f
        4f6ad17 xxxx!malloc+0x0000007a


0:000> !heap -p -a 3ca25e08
    address 3ca25e08 found in
    _HEAP @ 80000
      HEAP_ENTRY Size Prev Flags    UserPtr UserSize - state
        3ca25e00 0007 0000  [07]   3ca25e08    00020 - (busy)
        Trace: 8588
        7c855014 ntdll!RtlAllocateHeapSlowly+0x00000041
        7c83d9aa ntdll!RtlAllocateHeap+0x00000e9f
        776bcfce ole32!CRetailMalloc_Alloc+0x00000016
        77d0404a oleaut32!APP_DATA::AllocCachedMem+0x0000004f
        77d04341 oleaut32!SysAllocStringByteLen+0x0000003c
        77d03f9b oleaut32!ErrStringCopyNoNull+0x00000016
        77d0456f oleaut32!VariantCopy+0x0000007e
        4f35abd xxxx!std::_Construct<_variant_t,_variant_t>+0x0000004d

【问题讨论】:

  • 只是想知道 - 你的构建会发生在 omit frame pointers 上吗?
  • 我刚刚检查了项目,似乎我们没有使用 FPO。所以不应该有 FPO 问题。
  • vs2005 运行时使用 fpo,您可能依赖的其他 3rd 方可能也是如此

标签: debugging windbg gflags


【解决方案1】:

在 32 位 Windows 上,系统使用 EBP 链来获取堆栈跟踪。您需要禁用 FPO 优化 (/Oy-)。在 64 位 Windows 上,即使经过优化,您也可以获得良好的堆栈跟踪。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-11-20
    • 2013-09-20
    • 1970-01-01
    • 2010-10-11
    • 1970-01-01
    • 2014-09-12
    • 1970-01-01
    相关资源
    最近更新 更多