使用CMake安装的PDB文件 我使用CMAGE命令安装PDB文件,以便在我的C++应用程序的开发人员分发中启用调试。命令如下: INSTALL(DIRECTORY ${PROJECT_BINARY_DIR}/Debug DESTINATION bin FILES_MATCHING PATTERN *.pdb )
此外,我还设法在同一级别的“src”文件夹中安装了用于构建开发人员发行版的相关源代码,以便我的顶级发行版文件夹如下所示:使用CMake安装的PDB文件 我使用CMAGE命令安装PDB文件,以便在我的C++应用程序的开发人员分发中启用调试。命令如下: INSTALL(DIRECTORY ${PROJECT_BINARY_DIR}/Debug DESTINATION bin FILES_MATCHING PATTERN *.pdb ),c++,windows,visual-studio,cmake,C++,Windows,Visual Studio,Cmake,此外,我还设法在同一级别的“src”文件夹中安装了用于构建开发人员发行版的相关源代码,以便我的顶级发行版文件夹如下所示: include\ src\ lib\ bin\ share\ doc\ 3rdparty\ etc\ 如何让PDB文件“知道”源在哪里(我假设这是必需的)?是否有一个CMake命令可以实现这一点?一个小例子是什么?PDB文件按照编译程序时的方式存储文件的路径。您不必做任何事情让他们知道源文件的位置。PDB文件存储源文件的绝对路径名。当不使用符号服务器时,确保某种程度的源代码
include\
src\
lib\
bin\
share\
doc\
3rdparty\
etc\
如何让PDB文件“知道”源在哪里(我假设这是必需的)?是否有一个CMake命令可以实现这一点?一个小例子是什么?PDB文件按照编译程序时的方式存储文件的路径。您不必做任何事情让他们知道源文件的位置。PDB文件存储源文件的绝对路径名。当不使用符号服务器时,确保某种程度的源代码可重定位性的唯一方法是使用
subst
命令
其思想是使用subst
为源代码树的根创建驱动器号名称(例如N:\
)。然后从该驱动器执行构建,以便将以N:\
开头的绝对路径嵌入到PDB文件中。当您以后需要在另一台机器上调试可执行文件时,请在该机器上使用subst
,以获得到源文件的相同绝对路径。这将使PDB文件能够找到源文件
例如,如果您有一个文件C:\MySources\main.cpp
,请执行以下操作:
subst N: C:\MySources
N:
run your build
稍后,假设您需要在一台机器上进行调试,其中相同的文件存储在D:\Devel\Other\main.cpp
中。只需执行subst N:D:\Devel\Other
,然后也从N:
驱动器工作
这个答案很大程度上是基于本文中的信息和其中的链接。您只需要通知Visual Studio源代码在哪里。。。将弹出文件浏览器对话框;如果路径与构建时不同,只需指向本地计算机上的源代码即可。我只是提出了类似的问题 使用此安装规则将目标的PDB文件(如果存在)复制到目标的安装位置bin目录
install(FILES $<TARGET_PDB_FILE:${PROJECT_NAME}> DESTINATION bin OPTIONAL)
安装(文件$DESTINATION bin可选)
你确定这一点吗?我的意思是,如果它是PDB文件存储的绝对路径(到源代码的绝对路径),那么当我在另一个开发人员的工作站上使用时,它如何确定这一点?如果它是相对的,那么我是否应该确保我将源代码安装在与PDB“相对”相同的位置,就像它在构建时一样?我希望我说的有道理…你可以一直测试这个。。。VisualStudio(和WinDBG)都非常聪明,可以映射PDB的位置和源代码。VS将在与加载的模块相同的目录中查找PDB(也可以查看调试器中的模块选项卡)。您还可以通过调试选项告诉VS在哪里查找。当您单击堆栈调用时,如果源位于其他位置,VS将提示您输入位置。这甚至适用于崩溃转储。如果我们都必须有完全相同的源代码树布局,那么这种扩展会有多糟糕?你可能想看看。谢谢@Angew-我阅读了这篇文章以及其中的链接。我真的要经历所有的符号服务器业务吗?我想我要问的是:是否有一种聪明的方式来打包PDB和匹配的源代码,这样我就不必做任何其他事情(按照第一个答案的思路)。我没有场外调试的个人经验,但是我从所有关于移动PDB的文章中得到的印象是,您必须使用subst
或精确地镜像原始源代码树。出于好奇,我计划有朝一日调查这个问题;不幸的是,对于某一天相当不清楚的值。不幸的是,PDB中似乎嵌入了绝对路径名,因此必须镜像这些路径名。这就是建议使用subst
的原因。其想法是在N:
驱动器上进行构建,以便N:\
作为根目录嵌入到PDB文件中。然后,另一个开发人员必须在他们的计算机上执行subst
,以便他的计算机上N:
驱动器上的源路径与您的计算机上的路径相同。PDB将起作用。也就是说,如果你有一个文件C:\MySources\main.cpp
,你做了subst N:C:\MySources
,如果他有一个文件D:\Devel\Other\main.cpp
,他将不得不做subst N:D:\Devel\Other
,然后也从N:
驱动器工作。这个方案不能在任何地方使用。如果您的组织足够大,可能是驱动器号已被使用,或者您没有网络访问权限。总而言之,我认为使用StSTS作为代码嗅觉并避免它们。正如Matt在下面所说的,如果需要,IDE将提示输入源位置。事实上,所有调试器都能够从不同于构建时使用的路径加载源。