在没有 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 文件不存在,则不打印符号信息。
我的问题是 -
- 我的理解对吗?我没有找到这个记录。
- 这个 API 是为了 testing/debugging 目的而暴露的吗?如何让它在
上工作
不存在 pdb 文件的生产系统?
- 在 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
我知道 StackWalk64()
API 可以用来打印 windows 中的调用堆栈。
关于这在 SO 上是如何工作的,已经有很多讨论。
Function Call Stack in C++
StackWalk64 on Windows - Get symbol name
StackWalker - Walking the callstack
我观察到 StackWalk64()
需要符号文件(PDB 文件)才能找到函数名称。如果 pdb 文件不存在,则不打印符号信息。
我的问题是 -
- 我的理解对吗?我没有找到这个记录。
- 这个 API 是为了 testing/debugging 目的而暴露的吗?如何让它在
上工作 不存在 pdb 文件的生产系统? - 在 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