c++ - 调试 C++ 库

标签 c++ debugging gdb cmake

我一直致力于为 C++ 库添加功能。该库是使用 CMake 编译的。它有一组复杂的依赖关系。我有一个运行与库相关的代码的 C++ 测试文件。设编译后的文件为test.cpp,其可执行文件为test

到目前为止,我一直在通过向库文件中添加“cout”语句来进行调试。我经常遇到段错误,但通常可以通过检查来解决。显然,这是低效的。我想通过使用 gdb 查看代码在哪里失败。通过这个stackoverflow post ,我尝试向我的 cmake 添加调试标志,但是当我在 test 上运行 gdb 并执行 bt 时,我没有获得全面的信息。我只是获取代码失败的库中函数的名称,而不是确切的行。

谁知道如何获取gdb信息?

最佳答案

虽然手动添加相应的编译器标志会起作用,但这并不是最方便的方法。作为suggested by @ruslo ,您应该使用以下命令行来获取调试支持:

cmake -DCMAKE_BUILD_TYPE=Debug <path_to_source>

这有几个原因:

  • 编译器标志不可移植。 -g -O0 可以在 gcc 上运行,但是其他编译器呢? CMake 的主要优势之一是易于移植,因此您不应轻易将其扔出窗外。
  • 多配置生成器(像大多数 IDE 生成器一样)允许同时使用多个配置文件。您不会想强制这些 IDE 的用户在没有优化的情况下进行编译,即使他们选择了 Release 配置文件,对吗?
  • CMAKE_CXX_FLAGS 的更改是全局的。一旦您必须将多个项目组合在一起,这就变得特别讨厌。如果您绝对需要手动提供编译器标志,请使用 target_compile_options为此目的。
  • 最后但同样重要的是:设置 CMAKE_BUILD_TYPE 是解决此问题的惯用方法。它是解决它的唯一正确工具,熟悉 CMake 的人(当然,没有太多这样的东西......)如果你使用非惯用的解决方法来解决它会感到惊讶。

关于c++ - 调试 C++ 库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25189509/

相关文章:

c++ - 指针指向 0x1 - 检查 null 是否有效?

c++ - 在这种情况下,基类到底是什么?

c++ - Visual Studio 2010 从命令行运行 .exe 与运行 (f5) 调试

c# - 按位或 : C# versus C++

iphone - iOS 如何在没有堆栈跟踪的情况下调试崩溃,如 : [__NSArrayM objectAtIndex:]: index 0 beyond bounds for empty array?

c++ - 如何分析/跟踪已编译的 C++ 应用程序

java - 无法摆脱 JdbcOdbcDriver.finalize() 中的断点

c++ - libtool 减慢了 gdb

linux - 识别汇编中的库调用

c++ - 从自定义链表中删除一个值