【问题标题】:PDB files with CMake install使用 CMake 安装的 PDB 文件
【发布时间】:2013-02-03 11:42:21
【问题描述】:

我正在使用 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 命令?什么是一个小例子?

【问题讨论】:

  • 你可能想看看this question
  • 感谢@Angew - 我阅读了这篇文章以及其中链接中的文章。我真的必须经历所有的符号服务器业务吗?我想我要问的是:有没有一种聪明的方法来打包 PDB 和匹配的源,这样我就不必做任何其他事情(按照第一个答案的思路)。
  • 我没有异地调试的个人经验,但我从所有关于移动 PDB 的阅读中得到的印象是,您必须使用 subst 或完全镜像原始源代码树.出于好奇,我计划有一天调查这个问题;不幸的是,对于某一天的价值相当不明确。
  • 不幸的是,PDB 中似乎嵌入了 absolute 路径名,因此必须对这些路径名进行镜像。这就是为什么建议使用subst
  • 这个想法是在 N: 驱动器上进行构建,以便将 N:\ 作为根嵌入到 PDB 文件中。然后,其他开发人员必须在他们的计算机上执行subst,以便他计算机上N: 驱动器上的源路径与您计算机上的路径相同。 PDB 将起作用。 IE。如果你有一个文件C:\MySources\main.cpp,你做了subst N: C:\MySources,如果他有一个文件D:\Devel\Other\main.cpp,他必须做subst N: D:\Devel\Other,然后也从N:驱动器工作。

标签: c++ windows visual-studio cmake


【解决方案1】:

我只是answered my own 类似的问题,How to get CMake to install PDB files for targets

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

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

【讨论】:

    【解决方案2】:

    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: 驱动器那里工作。


    这个答案主要基于来自 question 的信息以及其中的链接。

    【讨论】:

    • 这个方案不能到处使用。如果您的组织足够大,则驱动器号可能已被使用,或者您没有网络访问权限。总而言之,我考虑使用 substs 作为代码气味并避免它们。如下所述,Matt 表示,如果需要,IDE 将提示输入源位置。
    【解决方案3】:

    你只需要告诉 Visual Studio 源在哪里...它会弹出一个文件浏览器对话框;如果路径与构建时不同,只需指向本地计算机上的源即可。

    【讨论】:

    • 确实,所有调试器都能够从不同于构建时使用的路径加载源代码。
    【解决方案4】:

    PDB 文件存储程序编译时的文件路径。您无需做任何事情来让他们知道来源在哪里

    【讨论】:

    • 你确定吗?我的意思是,如果它是 PDB 文件存储的绝对路径(源的绝对路径),那么当我在另一个开发人员的工作站上使用时,它如何确定我何时打包和运送?如果它是相对的,那么我是否应该确保将源安装在与 PDB 构建时“相对”相同的位置?我希望我有道理..
    • 您总是可以测试一下... Visual Studio(和 WinDBG)都足够聪明,可以映射 PDB 和源代码的位置。 VS 将在与加载模块相同的目录中查找 PDB(也请查看调试器中的模块选项卡)。您还可以通过调试选项告诉 VS 在哪里查看。当您单击堆栈调用时,如果源位于不同的位置,VS 会提示您输入位置。这甚至适用于故障转储。如果我们都必须拥有完全相同的源代码树布局,那么这种扩展会有多糟糕?
    猜你喜欢
    • 2017-04-13
    • 1970-01-01
    • 2021-12-03
    • 2023-01-27
    • 2013-11-24
    • 1970-01-01
    • 2015-11-18
    • 1970-01-01
    • 2016-09-30
    相关资源
    最近更新 更多