我想使用 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);
}
但问题是,当我在进程上运行它时,它总是给出相同的结果,即使应用程序本身是堆栈跟踪也是如此。你能帮我解决这个问题吗?
编辑:问题是它总是给出相同的符号名称和地址。
最佳答案
当您以这种方式使用RtlCaptureStackBackTrace
时,您正在捕获当前线程的堆栈跟踪。我认为您正在寻找的是:StackWalkEx
关于c - 使用 Windows api 的另一个进程 c 的堆栈跟踪,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48966193/