在没有 PDB 文件的情况下,是否可以在 Windows 上获取堆栈跟踪?如果是,如何?

Is it possible to obtain a stack trace on Windows without PDB files present? If yes, how?

我知道 StackWalk64() API 可以用来打印 windows 中的调用堆栈。 关于这在 SO 上是如何工作的,已经有很多讨论。

Function Call Stack in C++

StackWalk64 on Windows - Get symbol name

StackWalker - Walking the callstack

我观察到 StackWalk64() 需要符号文件(PDB 文件)才能找到函数名称。如果 pdb 文件不存在,则不打印符号信息。

我的问题是 -

  1. 我的理解对吗?我没有找到这个记录。
  2. 这个 API 是为了 testing/debugging 目的而暴露的吗?如何让它在
    上工作 不存在 pdb 文件的生产系统?
  3. 在 Linux 上,如果符号文件不存在,则像打印调用堆栈一样被破坏。至少在 windows 上能实现吗?

如果它只是一个堆栈跟踪,CaptureStackBackTrace() 应该足够了。

void *stack[48];
USHORT count = CaptureStackBackTrace(0, 48, stack, NULL);
for(USHORT c = 0; c < count; c++)
  printf("addr %02d: %p\n", c, stack[c]);

您问题的答案 -

1.我的理解正确吗?我没有找到这个记录。

是的。您需要符号来打印函数名称。不需要私有符号,public 符号也可以工作(如果你想发布 pdb)。

2。这个 API 是为了 testing/debugging 目的而暴露的吗?如何让它工作 不存在 pdb 文件的生产系统?

此 API 主要用于调试器,但它可用于许多工具,例如显示线程堆栈的高级任务管理器 (ProcessExplorer)。 如果您想要函数名称,则需要符号(至少 public 个符号)。

3。在 Linux 上,如果符号文件不存在,则像打印调用堆栈一样被破坏。至少能在windows

上实现

没有符号你可以实现的是 - 调用堆栈将模块名称与偏移量(从模块开始)例如xyz.dll+0x62