Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/video/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Debugging 如何进行库的源代码级调试_Debugging_Embedded_Gdb_Cross Compiling - Fatal编程技术网

Debugging 如何进行库的源代码级调试

Debugging 如何进行库的源代码级调试,debugging,embedded,gdb,cross-compiling,Debugging,Embedded,Gdb,Cross Compiling,我有以下设置。虽然我的工作设置是在Windows主机上处理ARM编译器Real View Developer Suite(RVDS)3.2,但这种情况对于任何主机上的任何其他C编译器都是通用的 我在Windows主机上使用RVDS3.2编译器工具链构建了一个C代码的ARM库(静态库-.a文件)。然后,我使用Linux主机上的ARM Linux编译器工具链将该库与应用程序链接,以获得ARM可执行文件。现在,当我尝试在Linux上使用gdb调试生成的ARM可执行文件时,通过尝试在链接的库中存在的某个

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

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

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

  • 我是否需要将源文件复制到与windows中的源文件文件夹结构完全相同的linux中


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

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

      nm /path/to/app | grep function_desired
    

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

    是否在构建库时启用了调试(
    -g
    选项)?如果没有这一点,将很难识别行等。

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

    IIRC源路径与编译器执行的目录(对于gcc)相关。换句话说,编译器在命令行上获得的路径。