CMake安装PDB文件

12

我正在使用CMake命令安装PDB文件,以在我的C++应用程序的开发者分发中启用调试。命令如下:

INSTALL(DIRECTORY ${PROJECT_BINARY_DIR}/Debug
    DESTINATION bin
    FILES_MATCHING
    PATTERN *.pdb
)

我已经成功安装了用于构建开发人员发布版的相关源代码,并将其放置在名为“src”的文件夹中,与顶层分发文件夹处于同一级别,因此我的顶层分发文件夹看起来如下:

include\
src\
lib\
bin\
share\
doc\
3rdparty\
etc\

我该如何让PDB文件“知道”源代码所在的位置(我假设这是必须的)? 是否有CMake命令可以实现此目的? 你能给一个小例子吗?


1
你可能想看一下这个问题:https://dev59.com/_XVD5IYBdhLWcg3wR5ko。 - Angew is no longer proud of SO
1
我没有远程调试的个人经验,但从我阅读有关移动PDB文件的所有内容中得到的印象是,您必须使用subst或完全镜像原始源树。 我计划有一天出于好奇心来调查这个问题;不幸的是,某一天的价值相当模糊。 - Angew is no longer proud of SO
“镜像原始源代码树”是指如果我将PDB和源代码打包在相对位置与它们在本地工作站上构建时相同,这样是吗? - squashed.bugaboo
1
不幸的是,PDB 中嵌入了绝对路径名,因此这些路径名必须被镜像。这就是为什么建议使用 subst - Angew is no longer proud of SO
1
想法是在 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: 驱动器开始工作。 - Angew is no longer proud of SO
显示剩余4条评论
4个回答

19

我刚刚回答了一个类似的问题,如何让CMake为目标安装PDB文件

使用这个安装规则将目标的PDB文件(如果存在)复制到目标的安装位置的bin目录中。

install(FILES $<TARGET_PDB_FILE:${PROJECT_NAME}> DESTINATION bin OPTIONAL)

4

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:驱动器上进行工作即可。
本答案主要基于此问题及其中的链接所提供的信息。

这种方案并不适用于所有情况。如果您的组织足够大,很可能驱动器字母已经被使用,或者您没有网络访问权限。总的来说,我认为使用substs是一种代码异味,并且会避免使用它们。正如Matt所述,如果需要,IDE将提示源位置。 - bltxd

3

您只需要告诉Visual Studio源代码的位置... 它将弹出一个文件浏览器对话框;如果路径与构建时不同,只需指向本地机器上的源代码。


1
确实,所有的调试器都能够从不同于构建时使用的路径加载源代码。 - bltxd

0
PDB文件存储了程序编译时文件的路径。您无需做任何事情来让它们知道源代码的位置。

你确定吗?我的意思是,如果PDB文件存储的是绝对路径(源代码的绝对路径),那么当我打包并在另一个开发者的工作站上使用时,它如何确定呢?如果是相对路径,那么我应该确保将源代码安装在与构建时“相对”相同的位置吗?希望我表达清楚了。 - squashed.bugaboo
你可以随时测试一下...Visual Studio(和WinDBG)都足够聪明,能够映射PDB和源代码的位置。VS将在已加载模块的相同目录中查找PDB(也可以在调试选项中指定查找路径)。当你点击堆栈调用时,如果源代码位于不同的位置,VS会提示你输入位置。即使是在崩溃转储文件中也适用。如果我们都必须拥有完全相同的源代码树结构,那将会有多么糟糕的扩展性呢? - Tim Finer

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接