调试和深入依赖项

有时,在开发和调试自己的代码时,能够深入到依赖项的源代码中进行调试可能会很有用。 有几点需要考虑

  • 来自 ConanCenter 的配方和包并不总是打包所有必要的调试工件来进行调试。 例如,在 Windows 上,*.pdb 文件不会被打包,因为它们非常大,而且在实践中很少使用。 您可以拥有自己的包来打包 PDB 文件(如果您需要),但这仍然无法解决下一个问题。

  • 调试工件通常不可重定位,这意味着这些工件只能在构建它们的源位置中使用。 但是,上传到服务器并下载到不同机器上的包可以将这些工件放在不同的文件夹中。 然后,调试工件可能无法正确找到源代码、符号等。

从源代码构建

调试依赖项的推荐方法是在本地缓存中从源代码构建它们。 这种方法对于大多数配方(包括 ConanCenter 配方)都应该开箱即用。

我们可以重用教程中的第一个示例的代码来解决此用例。 请先克隆源代码以重新创建此项目。 您可以在 GitHub 的 examples2 仓库 中找到它们

$ git clone https://github.com/conan-io/examples2.git
$ cd examples2/tutorial/consuming_packages/simple_cmake_project

然后,让我们确保依赖项是从源代码构建的

$ conan install . -s build_type=Debug --build="zlib/*"
...
Install finished successfully

假设我们有 CMake>=3.23,我们可以使用预设(否则,请使用 -DCMAKE_TOOLCHAIN_FILE 参数)

$ cmake . --preset conan-default

这将创建我们的项目,我们可以开始构建和调试它。

使用 Visual Studio 深入依赖项

创建项目后,在 Visual Studio 中,我们可以双击 compressor.sln 文件,或从打开的 Visual Studio IDE 打开该文件。

项目打开后,第一步是构建它,确保 Debug 配置是活动的,转到 Build -> Build Solution 即可完成。 然后我们可以将 compressor 定义为项目视图中的“启动项目”。

转到 compressor/main.c 源代码文件,我们可以在某一行中引入一个断点

main.c
int main(void) {
    ...

    // add a breakpoint in deflateInit line in your IDE
    deflateInit(&defstream, Z_BEST_COMPRESSION);
    deflate(&defstream, Z_FINISH);

单击 Debug -> Start Debugging(或 F5),程序将开始调试并在 deflateInit() 行处停止。 单击 Debug -> Step Into,IDE 应该能够导航到 deflate.c 源代码。 如果我们检查此文件,其路径将在 Conan 缓存中,例如 C:\Users\<myuser>\.conan2\p\b\zlib4f7275ba0a71f\b\src\deflate.c

deflate.c
int ZEXPORT deflateInit_(strm, level, version, stream_size)
 z_streamp strm;
 int level;
 const char *version;
 int stream_size;
 {
     return deflateInit2_(strm, level, Z_DEFLATED, MAX_WBITS, DEF_MEM_LEVEL,
                         Z_DEFAULT_STRATEGY, version, stream_size);
     /* To do: ignore strm->next_in if we use it as window */
 }

另请参阅

  • 使用这种方法,在调试时无法修改依赖项的源代码。 如果这是预期的流程,建议使用 可编辑包