【问题标题】:gdb set break in .so file, no source file namedgdb 在 .so 文件中设置中断,没有命名的源文件
【发布时间】:2019-01-30 07:25:38
【问题描述】:

我建立了一个项目女巫cmake。我有一个可执行文件,以及在make 之后生成的多个.so 文件。 .so 文件在build/lib 目录下,可执行文件在build/bin 目录下。

我的项目目录喜欢,

-main.cpp
-test.cpp
--cfd/cfd.cpp

cfd.cpp生成cfd.so,最后链接到可执行文件。

我可以在一些src文件中设置断点,比如main.cpptest.cpp等等,但是我不能在.so链接的源文件中设置断点,比如cfd.cpp

我尝试了几种方法,例如,

  • 设置 LD_LIBRARY_PATH(或 ldconfig [.so dir])
  • 设置 solib 搜索路径

当我运行 gdb 时,程序可以加载 .so 文件。我使用info shared,输出如下。

但我无法在cfd.cpp 设置休息时间。我使用命令b cfd.cpp:3333 行是在test.cpp 中调用的函数。 gdb 输出信息如下,

No source file named cfd.cpp.   
Make breakpoint pending on future shared library load? (y or [n]

谁能帮帮我,谢谢。

【问题讨论】:

  • libcdf_interrface 在读取列中有*。这意味着(*): Shared library is missing debugging information.。你能确认你的库没有调试信息吗?
  • 我将cmake设置为调试模式set(CMAKE_BUILD_TYPE "Debug"), set(CMAKE_CXX_FLAGS_DEBUG "$ENV{CXXFLAGS} -pg -std=c++11 -fPIC "),并将库设置为add_library(cfd_interface SHARED ${SRC})。 target_link_libraries 设置为general 模式。也许我错过了一些步骤。
  • -pg 用于分析。调试信息只需-g
  • 是的,我明白了。但这不会影响调试过程。
  • 我会在debug 模式下尝试target_link_libraries

标签: c++ debugging cmake gdb .so


【解决方案1】:

我无法在 cfd.cpp 设置中断

这是因为您的 libcfd_interface.so 编译时没有调试信息(这就是它旁边的小 (*} 的含义,正如 GDB 在 info shared 输出末尾告诉您的那样)。

修复方法是使用-g 标志重建它。

我发现编译成.so时,该命令没有-g选项,其他.so也没有。但是libgbk.so是可以读取的

你错了。如果libgbk.so编译 没有-g 标志,那么你也不能在其中设置断点。

请注意,编译时需要-g标志,这与链接不同(您为libcfd_interface.so显示link命令,因此您可能会混淆两者)。

【讨论】:

  • 我知道compilinglinking 进程之间的区别。也许我的问题是我不知道如何在调试模式下设置shared liarary compiling。我查看了cmake 命令,但找不到类似的东西。
  • 这个问题和我的一样。 stackoverflow.com/questions/33225978/…
猜你喜欢
  • 1970-01-01
  • 2012-03-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-01
  • 2011-11-19
  • 2012-08-10
  • 1970-01-01
相关资源
最近更新 更多