我想使用windows api从我的c应用程序(而不是c ++)中打印/制作正在运行的进程的堆栈跟踪。
目前我有这段代码:
void StackTrace(int pid)
{
unsigned int i;
void *stack[STACK_BUFFER];
unsigned short frames;
SYMBOL_INFO *symbol;
HANDLE process;
process = OpenProcess(PROCESS_ALL_ACCESS, FALSE, pid);
SymInitialize(process, NULL, TRUE);
frames = RtlCaptureStackBackTrace(0, STACK_BUFFER, stack, NULL);
symbol = (SYMBOL_INFO *)calloc(sizeof(SYMBOL_INFO) + 256 * sizeof(char), 1);
symbol->MaxNameLen = 255;
symbol->SizeOfStruct = sizeof(SYMBOL_INFO);
for (i = 0; i < frames; i++) {
SymFromAddr(process, (DWORD64)(stack[i]), 0, symbol);
if (symbol->NameLen != 0)
printf("%s at %09x\n", symbol->Name, symbol->Address);
}
free(symbol);
}
但问题是,当我在进程上运行它时,它总是给我相同的结果,即使应用程序是堆栈跟踪本身。你能帮我解决这个问题吗?
编辑:问题是它总是给出相同的符号名称和地址。