如何进行库的源级调试

时间:2009-04-01 14:19:27

标签: debugging embedded gdb cross-compiling

我有以下设置。虽然我的工作设置在Windows主机上处理ARM编译器Real View Developer Suite(RVDS)3.2,但这种情况对于任何主机上的任何其他C编译器都是通用的。

我在Windows主机上使用RVDS 3.2编译器工具链构建了一个C代码的ARM库(静态库 - .a文件)。然后,我使用Linux主机上的ARM-Linux编译器工具链将该库与应用程序链接,以获取ARM可执行文件。现在,当我尝试使用gdb在Linux上调试此生成的ARM可执行文件时,通过尝试在链接的库中存在的某个函数中放置断点,gdb无法在那里引入断点,引用未找到的源。所以我手动复制了用于在存在可执行文件的Linux文件夹中创建库的所有源文件(* .c)。仍然gdb没有提出断点。 所以现在我开始思考:

  1. 如何通过启动通过将此库链接到应用程序(在gdb中)生成的可执行文件,使用不同的编译器链在Windows上创建此库的源代码级调试。可能吗?我该怎么做? RVDS编译器工具链中是否有任何编译器选项来启用此库源代码级调试?

  2. 我是否需要将源文件复制到linux,其文件夹结构与Windows中存在的源文件完全相同?

4 个答案:

答案 0 :(得分:1)

您可以尝试查看模仿完全相同的目录结构是否有效。如果你不确定编译器在可执行文件的调试信息中注释了什么目录结构,你总是可以用dwarfdump(在linux上)查看它。

答案 1 :(得分:1)

首先,GDB 需要任何源来在函数上放置断点;所以你对实际发生的事情的描述可能是不准确的。我首先要验证你要打破的函数实际上是否存在于二进制文件中:

  nm /path/to/app | grep function_desired

其次,要进行源代码级调试,GDB需要以GDB理解的格式调试信息。在Linux上,这通常意味着DWARFSTABS。您的RVDS编译器很可能不会发出此类调试信息;如果是这样,将无法进行源级调试。

答案 2 :(得分:1)

您是否在启用调试的情况下构建了库(-g选项)?如果没有这个,就很难识别出行等。

答案 3 :(得分:1)

我发现-fPIC会导致这类问题,但我发现的唯一解决方法是在我想调试时不使用-fPIC。