c - 使用 Windows api 的另一个进程 c 的堆栈跟踪

标签 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);
}

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

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

最佳答案

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

关于c - 使用 Windows api 的另一个进程 c 的堆栈跟踪,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48966193/

相关文章:

c - 将程序设置为我的登录 shell

c++ - 转换 "application's"内存地址

c++ - 分解字符串并使用 keybd 发送字符

c# - 将 SetTimer() 和 KillTimer() 移植到 C#?

c - 在运行时为文件分配唯一编号

c - 关于C语言宏的疑惑

c - 为什么要将 40 添加到传递给 LocalAlloc 的大小中?

c++ - 在编辑控件中显示无效输入的工具提示

c++ - 将成员函数指针转换为 TIMERPROC

c++ - -Ofast 在使用 long double 时产生不正确的代码