使用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的主要内容,如果未能解决你的问题,请参考以下文章

跟踪所有进程的 Windows API 调用

windows进程中的内存结构(好多API,而且VC最聪明)

Windbg 堆栈跟踪问题

c_cpp Windows C ++代码扫描另一个进程

在应用程序崩溃/C++ 期间获取堆栈跟踪

来自未处理异常的 C++ 堆栈跟踪?