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

iqxoj9l9  于 2023-10-23  发布在  Windows
关注(0)|答案(3)|浏览(112)

我知道StackWalk64() API可以用来在windows中打印调用堆栈。有很多关于如何在SO上工作的讨论。
Function Call Stack in C++
StackWalk64 on Windows - Get symbol name
StackWalker - Walking the callstack
我观察到StackWalk64()需要符号文件(PDB文件)来显示函数名。如果不存在PDB文件,则不打印符号信息。
我的问题是-
1.我的理解正确吗?我没发现有记录。
1.此API是否出于测试/调试目的而公开?如何让它工作
不存在PDB文件的生产系统?
1.在Linux上,如果符号文件不存在,则会像打印的调用堆栈一样损坏。至少在Windows上可以实现吗?

hmmo2u0o

hmmo2u0o1#

如果只是一个堆栈跟踪,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]);
s6fujrry

s6fujrry2#

回答你的问题-

  • 1.我的理解是否正确?我没有找到这方面的记录。*

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

  • 2.此API是否暴露用于测试/调试目的?如何让它在没有PDB文件的生产系统上工作?*

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

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

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

shyt4zoc

shyt4zoc3#

是的。PE文件可以嵌入调试符号,但msvc似乎不支持此功能(How to instruct MSVC to embed symbols in the executable?)。分隔.exe文件和.pdb文件的原因是为了更快地链接。
windows上的Mingw会将调试符号直接嵌入到.exe文件中,而不是msvc输出到pdb文件中。
在Linux和macos上,通过elf/mach-o文件的符号表,一些最小的信息可能可用于堆栈跟踪。

相关问题