使用windows api堆栈跟踪另一个进程c

时间:2018-02-24 18:24:06

标签: c winapi

我想使用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);
}

但问题是,当我在进程上运行它时,它总是给我相同的结果,即使应用程序是堆栈跟踪本身。你能帮我解决这个问题吗?

编辑:问题是它总是给出相同的符号名称和地址。

1 个答案:

答案 0 :(得分:0)

当您以这种方式使用RtlCaptureStackBackTrace时,您正在捕获当前线程的堆栈跟踪。我认为您正在寻找的是:StackWalkEx