远程转储分析 - "user mode stack trace database" 是转储文件的参数吗?
remote dump analysis - is the "user mode stack trace database" par to the dump file?
如果我需要分析来自远程机器的转储中的内存泄漏,并且我已经启用了用户模式堆栈跟踪数据库,详见 here 这些堆栈跟踪是否将成为转储的一部分文件或者我需要从远程机器传输除转储文件以外的其他东西?或者,当 运行 WinDBG 在同一台机器上进行转储时,我只能看到这些堆栈吗?到目前为止,我所看到的关于这个主题的所有资源,都没有详细说明这些堆栈的实际存储位置。
数据库应该在转储中
编译,运行 在一个命令提示符 gflags /i dbstk.exe +ust +hpa & dbstk
将等待按键
打开另一个命令提示符并附加到 运行ning exe
cdb -pn dbstk.exe
并创建转储
.dump /ma d:\blah.dmp
打开转储并查看堆栈跟踪数据库
cdb -z d:\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>
如果我需要分析来自远程机器的转储中的内存泄漏,并且我已经启用了用户模式堆栈跟踪数据库,详见 here 这些堆栈跟踪是否将成为转储的一部分文件或者我需要从远程机器传输除转储文件以外的其他东西?或者,当 运行 WinDBG 在同一台机器上进行转储时,我只能看到这些堆栈吗?到目前为止,我所看到的关于这个主题的所有资源,都没有详细说明这些堆栈的实际存储位置。
数据库应该在转储中
编译,运行 在一个命令提示符 gflags /i dbstk.exe +ust +hpa & dbstk
将等待按键
打开另一个命令提示符并附加到 运行ning exe
cdb -pn dbstk.exe
并创建转储
.dump /ma d:\blah.dmp
打开转储并查看堆栈跟踪数据库
cdb -z d:\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>