如何访问由“gflags.exe”创建的总“用户模式堆栈跟踪数据库”,如sql DB? 否则,你能告诉我一些关于ust DB的API文档吗?
我使用“gflags.exe”在+ ust标志上打字,所以我可以获得堆栈跟踪创建一个内存块。
但我想通过callstack(比如umdh或leakdiag)编译统计内存分配组只是为了学习。 我想有一些查询ust DB的界面,但我找不到.. 有没有办法查询或枚举最佳数据库?
感谢您阅读。
答案 0 :(得分:1)
使用UMDH作为API。 UMDH使用文本文件来存储其数据:
umdh -pn:Program.exe -f:before.txt
// do something
umdh -pn:Program.exe -f:after.txt
您甚至可以重复这些步骤来获取更多文本文件。然后,您可以解析n个文本文件(这是您的“数据库”)(您必须使用C#或Python等编程语言编写查询)并进行分析。
有些工具已经像这样工作了。在我以前的公司,我们使用UMDHGrapher(不公开提供),UmdhViz或Umdh Visualize都是这样做的。
答案 1 :(得分:1)
看看avrfsdk.h它暴露了一些与Stack_trace_database一起玩的接口
显示如何获取分配堆栈跟踪的示例代码如下所示
无需优化编译
(cl / Zi / W4 / analyze / Od foo.cpp / link / release)
启用pageheap并在已编译的exe上收集堆栈跟踪 gflags / i foo.exe + ust + hpa
运行它以获取allocme()
中单个malloc()的堆栈跟踪#include <windows.h>
#include <stdio.h>
#include <avrfsdk.h>
#include <intrin.h>
#define ALLOCSIZ 0x1337
typedef ULONG(WINAPI * VerifierEnumResource)(HANDLE Process, ULONG Flags,
ULONG ResourceType, AVRF_RESOURCE_ENUMERATE_CALLBACK ResourceCallback,
PVOID EnumerationContext
);
ULONG WINAPI HeapAllocCallback(PAVRF_HEAP_ALLOCATION HeapAllocation, PVOID, PULONG) {
if (HeapAllocation->UserAllocationSize == ALLOCSIZ) {
printf("Index=%x\tDepth=%x\n", HeapAllocation->BackTraceInformation->Index,
HeapAllocation->BackTraceInformation->Depth);
for (ULONG i = 0; i < HeapAllocation->BackTraceInformation->Depth; i++) {
printf("%I64x\n", HeapAllocation->BackTraceInformation->ReturnAddresses[i]);
}
}return 0;
}
char * allocme() { printf("%p\n", _ReturnAddress()); return (char *)malloc(ALLOCSIZ); }
int main(void) {
char *foo = allocme();
if (foo) {
memcpy(foo, "VerifierEnumerateResource\0", 26);
HMODULE hMod;
if ((hMod = LoadLibraryA("verifier.dll")) == NULL) { return 0; }
VerifierEnumResource VerEnuRes;
if ((*(FARPROC *)&VerEnuRes = GetProcAddress(hMod, foo)) == NULL) {
return 0;
};
HANDLE hProcess = GetCurrentProcess();
VerEnuRes(hProcess, 0, AvrfResourceHeapAllocation,
(AVRF_RESOURCE_ENUMERATE_CALLBACK)HeapAllocCallback, NULL);
}return getchar();
}
执行结果
:>ls
dbstk.cpp
:>cl /nologo /Zi /W4 /analyze /Od dbstk.cpp /link /nologo /release
dbstk.cpp
:>gflags /i dbstk.exe +ust +hpa
Current Registry Settings for dbstk.exe executable are: 02001000
ust - Create user mode stack trace database
hpa - Enable page heap
:>dbstk.exe
008710CB <<<<<<<<<<<<<<<<<<<<<<<<<<
Index=0 Depth=b
10c38e89
77105ede
770ca40a
77095ae0
890e7d
8710ae
8710cb <<<<<<<<<<<<<<<<<<<<<<<<<<<
871390
76c4ed6c
770a37eb
770a37be