2013-05-01 42 views
1

我正在使用gdb来调试针对静态库编译的程序。库和程序都是用调试符号编译的。 对于这个库,gdb只能看到在.h文件中实现的源代码,而不是在.cpp文件中实现的源代码。我想知道为什么?对于库,GDB只能在头文件中看到源文件,而.cpp文件中的源文件不可用

  • 例如

    (gdb) info sources 
    

    只列出了从该库的头文件,并没有.cpp文件。

  • 我可以在.cpp文件中实现的某些功能设置断点。例如gdb理解此命令:

    (gdb) break orgQhull::Qhull::runQhull, 
    

    它是,然而,不可能将调试功能的体内的代码。 (只有使用stepi命令才能在汇编器级别单步执行各个指令。)另一方面,debuger能够看到在头文件中实现的函数代码。

  • backtrace命令报告有“没有可用符号表”为runQhull功能前面提到:

    (gdb) backtrace full 
    
    #0 0x00000000004d361a in orgQhull::Qhull::runQhull(orgQhull::RboxPoints const&, char const*)() 
    No symbol table info available. 
    #1 0x000000000049573a in ConvexHull::ConvexHull (this=0x7fffffffcb70, tree=..., begin=..., end=...) 
        at /home/filip/fel/dp/sandbox/src/populating_octomap/include/ConvexHull.h:40 
    

可能是什么原因呢?欢迎任何建议!

一些细节:

  • 有问题的图书馆是Qhull的libqhullcpp.a与源在git://gitorious.org/qhull/qhull.git
  • 操作系统:Ubuntu 12.04.2 LTS与GNU/Linux的3.2.0-40泛型#64 Ubuntu的SMP x86_64的
  • GCC(Ubuntu的/ Linaro的4.6.3-1ubuntu5)4.6.3
  • GNU GDB(Ubuntu的/ Linaro的7.4-2012.04-0ubuntu2.1)7.4-2012.04
+0

库是否在调试中编译? – Ryan 2013-05-01 20:14:48

+0

您是否在gdb源搜索路径中包含了库源代码目录? – yhager 2013-05-01 20:23:49

+0

我真的很抱歉,我很抱歉。我已经遵守了错误的图书馆档案。静态库的调试版本是用后缀创建的,我没有意识到这一点。 Mea culpa。感谢您的帮助。感谢您的时间。 – 2013-05-02 22:51:17

回答

1

这可能是什么原因?

要么

  • 你已经建立了图书馆没有-g标志,或者你已经剥去库它建后
  • (这是非常不可能的)。

检查您的库构建日志。你相信你用-g做了它,但你是很可能是弄错了。

+0

你说得对。感谢您的时间。我真的很抱歉我浪费了你的时间。 – 2013-05-02 22:52:45

+0

我编译了错误的库存档。我正在使用CMake来构建库和我的程序。库**的**调试版本**是用后缀**创建的,我没有意识到这一点。非调试版本被命名为'libqhullcpp.a',即使在'make clean'之后,它仍停留在build目录中。用'-g'构建的版本被命名为'libqhullcpp_d.a'。看起来在现有的构建目录中更改构建类型“-DCMAKE_BUILD_TYPE = Debug”似乎不是一个好主意? – 2013-05-02 23:05:33

+0

我应该在问题中添加[cmake]标签吗?我应该修改它以使其对其他用户更有用吗?或者我应该创建另一个问题/答案对吗?这里有什么优先选择? – 2013-05-02 23:06:42