如果我需要分析来自远程机器的转储中的内存泄漏,并且我已启用用户模式堆栈跟踪数据库,详细信息请参见此处,这些堆栈跟踪将成为转储文件的一部分,或者我需要从远程机器除了转储文件?或者我只能在进行转储的同一台机器上运行 WinDBG 时看到这些堆栈?到目前为止,我所看到的有关此主题的所有资源都没有详细说明这些堆栈的实际存储位置是什么。
问问题
28 次
1 回答
1
数据库应在转储中
查看此处以获取示例
编译,在一个命令提示符下运行 gflags /i dbstk.exe +ust +hpa & dbstk
将等待按键
打开另一个命令提示符并附加到正在运行的 exe
cdb -pn dbstk.exe
并创建一个转储
.dump /ma d:\blah.dmp
打开转储并查看堆栈跟踪数据库
cdb -zd:\blah.dmp
!heap -p
你应该得到类似这样的东西,表明转储中的地址
0:001> !heap -p
Active GlobalFlag bits:
hpa - Place heap allocations at ends of pages
StackTraceDataBase @ 000001922cbb0000 of size 0000000001800000 with 00000010 traces
PageHeap enabled with options:
ENABLE_PAGE_HEAP
COLLECT_STACK_TRACES
active heaps:
+ 1922e3b0000
ENABLE_PAGE_HEAP COLLECT_STACK_TRACES
NormalHeap - 1922f460000
HEAP_GROWABLE
+ 1922f560000
ENABLE_PAGE_HEAP COLLECT_STACK_TRACES
NormalHeap - 19230640000
HEAP_GROWABLE HEAP_CLASS_1
0:001>
但是 !heap 扩展由于以安全的名义对堆结构进行了多次修改而变得几乎无用,
并且扩展一直落后,
因此您可能被迫在位和字节中摸索
在 x64 上,我认为您应该从这里开始摸索(可能是错误的,用一小撮盐长时间没有接触 x64 堆)
0:001> dt ntdll!_STACK_TRACE_DATABASE poi(ntdll!RtlpStackTraceDatabase)
+0x000 Reserved : [104] ""
+0x000 Lock : _RTL_STACK_DATABASE_LOCK
+0x068 Reserved2 : (null)
+0x070 PeakHashCollisionListLength : 0
+0x078 LowerMemoryStart : 0x00000192`2cbd57e0 Void
+0x080 PreCommitted : 0 ''
+0x081 DumpInProgress : 0 ''
+0x088 CommitBase : 0x00000192`2cbb0000 Void
+0x090 CurrentLowerCommitLimit : 0x00000192`2cbd9000 Void
+0x098 CurrentUpperCommitLimit : 0x00000192`2e3af000 Void
+0x0a0 NextFreeLowerMemory : 0x00000192`2cbd8a90 ""
+0x0a8 NextFreeUpperMemory : 0x00000192`2e3aff80 "???"
+0x0b0 NumberOfEntriesLookedUp : 0x17f
+0x0b4 NumberOfEntriesAdded : 0x10
+0x0b8 EntryIndexArray : 0x00000192`2e3b0000 -> 0xeeeeeeee`eeeeeeee _RTL_STACK_TRACE_ENTRY
+0x0c0 NumberOfEntriesAllocated : 0x6c
+0x0c4 NumberOfEntriesAvailable : 0
+0x0c8 NumberOfAllocationFailures : 0
+0x0d0 FreeLists : [32] _SLIST_HEADER
+0x2d0 NumberOfBuckets : 0x254f
+0x2d8 Buckets : [1] _RTL_STD_LIST_HEAD
0:001>
于 2021-08-11T11:36:40.020 回答