我正在使用 Microsoft Visual Studio 2017 开发一个 C++ 项目。boost::stacktrace::stacktrace()
当应用程序崩溃时,我们使用 API 生成函数堆栈跟踪。
最近我在 Release 版本中注意到,当生成 PDB 文件时,它的绝对路径嵌入到 exe/dll 文件中。如果 PDB 文件存在于该路径并且应用程序崩溃,则生成的堆栈跟踪将被解码,即由实际函数名称组成。如果 PDB 文件不在该路径中,则对堆栈跟踪进行编码,即它仅包含一些十六进制堆栈地址。
然后我发现我们可以使用链接器选项删除exe/dll文件中的PDB目录路径,只保留它的基本名称,即PDB文件名/PDBALTPATH:%_PDB%
。
我使用前面提到的链接器选项并通过将PDB文件而不更改其名称放在同一目录中的exe / dll文件旁边进行了实验,并且我预计会生成解码的堆栈跟踪,因为exe中的新PDB路径/dll 文件应被解释为相对路径。但是当应用程序现在崩溃时,生成的堆栈跟踪会被编码。
为什么boost:stacktrace::stacktrace()
在前面提到的案例中没有找到 PDB 文件?