在没有PDB文件的情况下,是否可以在Windows上获得堆栈跟踪?如果是,如何
Is it possible to obtain a stack trace on Windows without PDB files present? If yes, how?
我知道StackWalk64()
API可以用于在窗口中打印调用堆栈。关于这在SO上是如何工作的,已经有很多讨论了
C++中的函数调用堆栈
Windows上的StackWalk64-获取符号名称
StackWalker-行走调用堆栈
我观察到StackWalk64()
需要符号文件(PDB文件)才能找到函数名称。如果pdb文件不存在,则不打印符号信息。
我的问题是-
- 我的理解正确吗?我找不到这方面的记录
- 此API是否出于测试/调试目的而公开?如何在
上运行没有pdb文件的生产系统 - 在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
相关文章:
- 用于解析 win64 堆栈跟踪的命令行客户端(可以访问符号服务器)
- 提升堆栈跟踪不显示函数名称和行号
- cygwin_exception::open_stackdumpfile:将堆栈跟踪转储到 class4.exe.sta
- 如何按指针查看堆栈跟踪
- WinDbg 不显示某些小型转储文件的完整堆栈跟踪
- 发布代码的 gdb 堆栈跟踪可读性如何影响 x64?
- 提升::堆栈跟踪::safe_dump_to输出大小
- Qt 5.9中的QML崩溃-帮助读取堆栈跟踪
- 如何获取崩溃的DLL的堆栈跟踪?
- 当外部源代码中发生异常时,无法正确使用自创建的小型转储文件的堆栈跟踪
- 在 Linux 平台上以 C/C++ 打印进程的所有线程堆栈跟踪
- Boost 堆栈跟踪异步信号安全吗?
- 使用 gdb 时无法获取堆栈跟踪
- VC++ 堆栈跟踪不会解析生产环境中的函数名称
- 从堆栈跟踪中查找共享库中的源代码行
- 捕获异常后的堆栈跟踪
- 是否有一种便携式/标准的方法可以在堆栈跟踪中获取文件名和亚麻布
- 为什么谷歌测试不打印堆栈跟踪或文件名
- 在明夫中打印堆栈跟踪
- GDB 显示奇怪的堆栈跟踪