ユーザーモードスタックトレースを有効にするときに、フルスタックトレースを取得してみませんか?

StackOverflow https://stackoverflow.com/questions/7322921

  •  27-10-2019
  •  | 
  •  

質問

私はいくつかのメモリの断片化の問題にトラブルシューティングをしているので、物事が割り当てられている理由と最終的に割り当てを行っている理由を理解しようとしています。そこで、プロセスのUsermodeスタックトレース(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
役に立ちましたか?

解決

32ビットウィンドウで、システムはEBPチェーンを使用してスタックトレースを取得します。 FPO最適化を無効にする必要があります(/oy-)。 64ビットウィンドウでは、最適化があっても優れたスタックトレースが得られます。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top