Как я могу получить доступ ко всей «базе данных трассировки стека в режиме пользователя», созданной «gflags.exe», как sql DB?
В противном случае, не могли бы вы рассказать мне несколько документов по API об устаревших БД?
Я настроил флаг + ust с помощью «gflags.exe», так что я могу получить трассировку стека, создавая блок памяти.
Но я хочу скомпилировать статистику распределения памяти по группам вызовов (например, umdh или leakdiag) только для изучения.
Я думаю, что есть какой-то интерфейс для запроса к БД, но я не могу найти ..
Есть ли какой-либо способ сделать запрос или перечислить устаревшую БД?
Спасибо, что прочитали это.
Используйте 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 визуализировать которые все так делают.
взгляните на avrfsdk.h, он предоставляет некоторые интерфейсы для игры со Stack_trace_database
пример кода, который показывает, как получить трассировку стека выделения, показан ниже
компилировать без оптимизации
(cl / Zi / W4 / analysis / Od foo.cpp / link / release)
включить pageheap и собрать трассировку стека на скомпилированном exe
gflags / i foo.exe + ust + hpa
запустите его, чтобы получить трассировку стека для единственного malloc () в allocme ()
#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