gal*_*arm 4 windows debugging memory-leaks memory-management windbg
我们的应用程序中存在缓慢的内存泄漏,并且我已经尝试分析泄漏原因以下步骤:
0:000> !heap -p -a 10576ef8
address 10576ef8 found in
_HEAP @ 1250000
HEAP_ENTRY Size Prev Flags UserPtr UserSize - state
10576ed0 000a 0000 [03] 10576ef8 0000c - (busy)
mscoreei!CLRRuntimeInfoImpl::`vftable'
7c94b244 ntdll!RtlAllocateHeapSlowly+0x00000044
7c919c0c ntdll!RtlAllocateHeap+0x00000e64
603b14a4 mscoreei!UtilExecutionEngine::ClrHeapAlloc+0x00000014
603b14cb mscoreei!ClrHeapAlloc+0x00000023
603b14f7 mscoreei!ClrAllocInProcessHeapBootstrap+0x0000002e
603b1614 mscoreei!operator new[]+0x0000002b
603d402b +0x0000005f
603d5142 mscoreei!GetThunkUseState+0x00000025
603d6fe8 mscoreei!_CorDllMain+0x00000056
79015012 mscoree!ShellShim__CorDllMain+0x000000ad
7c90118a ntdll!LdrpCallInitRoutine+0x00000014
7c919a6d ntdll!LdrpInitializeThread+0x000000c0
7c9198e6 ntdll!_LdrpInitialize+0x00000219
7c90e457 ntdll!KiUserApcDispatcher+0x00000007
Run Code Online (Sandbox Code Playgroud)
这看起来像线程初始化调用堆栈,但我需要知道更多.为了确保泄漏的确切原因,您建议采取的下一步措施是什么?
使用GFlags时记录的堆栈是在不使用.pdb的情况下完成的,通常不正确.由于您已将泄漏跟踪到给定堆上的特定大小,因此您可以尝试在RtlAllocateHeap中设置实时中断并使用正确的符号检查windbg中的堆栈.我使用了以下内容并取得了一些成功.您必须编辑它以适合您的堆和大小.
$$ Display stack if heap handle eq 0x00310000 and size is 0x1303
$$ ====================================================================
bp ntdll!RtlAllocateHeap "j ((poi(@esp+4) = 0x00310000) & (poi(@esp+c) = 0x1303) )'k';'gc'"
Run Code Online (Sandbox Code Playgroud)
也许你会为罪犯获得另一个筹码和其他想法.
| 归档时间: |
|
| 查看次数: |
2198 次 |
| 最近记录: |