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

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

本文关键字:堆栈 跟踪 如何 如果 PDB 文件 是否 情况下 Windows      更新时间:2023-10-16

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

C++中的函数调用堆栈

Windows上的StackWalk64-获取符号名称

StackWalker-行走调用堆栈

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

我的问题是-

  1. 我的理解正确吗?我找不到这方面的记录
  2. 此API是否出于测试/调试目的而公开?如何在
    上运行没有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: %pn", c, stack[c]);

问题解答-

1.我的理解正确吗?我找不到这方面的记录

是的。您需要符号来打印函数名称。不需要有私人符号,公共符号也可以(如果你想运送pdb)。

2.此API是否出于测试/调试目的而公开?如何使其工作没有pdb文件的生产系统

这个API主要用于调试器,但它可以用于许多工具,例如显示线程堆栈的Advance任务管理器(ProcessExplorer)。如果需要函数名称,则需要符号(至少是公共符号)。

3.在Linux上,如果符号文件不存在,则会像打印调用堆栈一样被损坏。至少可以在windows上实现

您可以在没有符号的情况下实现的是-调用堆栈将modulename与偏移量(从模块开始),例如xyz.dll+0x62