windows - 我怎样才能访问总数 "user mode stack trace database(ust)"?

windows - How can i access total "user mode stack trace database(ust)"?

我如何访问 "gflags.exe" 创建的 "user mode stack trace database" 数据库,例如 sql 数据库? 否则,你能告诉我一些关于 ust DB 的 API 文档吗?

我使用 "gflags.exe" 调整了 +ust 标志,因此我可以获得创建内存块的堆栈跟踪。

但我想通过调用堆栈(如umdh 或leakdiag)编译统计内存分配组,仅供研究。 我想有一些查询 ust 数据库的接口,但我找不到.. 有什么方法可以查询或枚举 ust 数据库吗?

使用 UMDH 作为 API。 UMDH 使用文本文件来存储其数据:

umdh -pn:Program.exe -f:before.txt
// do something
umdh -pn:Program.exe -f:after.txt

您甚至可以重复这些步骤来获取更多文本文件。然后你有 n 个文本文件(那是你的 "database"),你可以解析(你必须用 C# 或 Python 等编程语言编写查询)并分析。

已经有一些工具可以像这样工作。在我以前的公司中,我们使用 UMDHGrapher(未公开提供)并且 UmdhViz or Umdh Visualize 都是这样做的。

看看 avrfsdk.h 它公开了一些可以玩的接口 Stack_trace_database

显示如何获取分配堆栈跟踪的示例代码如下所示

不优化编译
(cl /Zi /W4 /analyze /Od foo.cpp /link / release)

启用页面堆并在已编译的 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[=10=]", 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