使用windows api堆栈跟踪另一个进程c
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用windows api堆栈跟踪另一个进程c相关的知识,希望对你有一定的参考价值。
我想使用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
以上是关于使用windows api堆栈跟踪另一个进程c的主要内容,如果未能解决你的问题,请参考以下文章