Pourquoi ne pas vous obtenez des traces complètes de la pile lors de l'activation du mode utilisateur trace de la pile?

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

  •  27-10-2019
  •  | 
  •  

Question

Je dépannage des problèmes de fragmentation de la mémoire et j'ai essayé de comprendre pourquoi les choses sont allouées et qui fait finalement l'allocation. Alors j'ai permis traces de la pile de usermode pour le processus (drapeau + UST gflags) et a obtenu une décharge. Lorsque j'analyse la décharge et utilise le! Tas -p -a Some_Address. Je vois une trace de la pile, mais il est tout sauf une trace complète. D'habitude, je ne vois 4-7 fonctions à la trace, puis il arrête. Aucune erreur ne sont signalées dans la pile, mais malheureusement, il ne dispose pas d'informations suffisantes. J'ai vérifié un tas des allocations et ils semblent tous avoir le même problème. Je pensais que ce serait peut-être la taille de la base de données de la pile, mais je me serais attendu à des entrées entières perdues au lieu de simplement perdre une partie d'entre eux. Y at-il quelque chose que je peux faire pour augmenter la taille totale de la pile visible. Quelques exemples sont en dessous des piles que je vois.

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
Était-ce utile?

La solution

Sur Windows 32 bits le système utilise la chaîne RASE pour prendre une trace de la pile. Vous devez désactiver l'optimisation de Polynésie française ( / Oy- ). vous obtiendrez une bonne trace de la pile sur Windows 64 bits, même avec l'optimisation.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top