gdb无法加载源文件?

时间:2014-02-21 08:15:40

标签: linux gcc gdb

  1. 我只是使用arm-linux-gcc使用-g在主机(debian i386)上编译一个简单的c文件。
  2. 然后将a.out文件复制到目标(arm,uclibc)计算机。
  3. 运行a.out即可。
  4. 使用gdb(terget)gdb a.out并列出源代码,它显示No such file or directory。 事实一直如此?
  5. 如果我将1.c文件复制到目标,则list命令会列出源代码。
  6. 我的问题:

    gdb一直如此,或者我还能控制其他选项吗?

    您对调试程序有什么建议吗?

    对不起我的英语不好

    有些信息可能有用:

    源代码1.c文件

    #include <stdio.h>
    #include <string.h>
    #include <stdlib.h>
    // main function
    int main(void)
    {
        int i;
        for(i=0;i<3;i++){
            printf("i=%d\n",i);
        }
        return 0;
    }
    

    交叉编译版本(主持人)

    zodiac1111@debian:tmp$ arm-linux-gcc -v
    Using built-in specs.
    Target:arm-unknown-linux-uclibcgnueabi
    Configured with:/home/ldsh/rt9x5/linux/buildroot/buildroot/output/toolchain/gcc-4.3.5/configure \
    --prefix=/opt/rt9x5/arm-linux-uclibcgnueabi/usr --build=i686-pc-linux-gnu --host=i686-pc-linux-gnu \
    --target=arm-unknown-linux-uclibcgnueabi --enable-languages=c,c++ \
    --with-sysroot=/opt/rt9x5/arm-linux-uclibcgnueabi/usr/arm-unknown-linux-uclibcgnueabi/sysroot \
    --with-build-time-tools=/opt/rt9x5/arm-linux-uclibcgnueabi/usr/arm-unknown-linux-uclibcgnueabi/bin \
    --disable-__cxa_atexit --enable-target-optspace --disable-libgomp --with-gnu-ld --disable-libssp \
    --disable-multilib --disable-tls --enable-shared --with-gmp=/opt/rt9x5/arm-linux-uclibcgnueabi/usr \
    --with-mpfr=/opt/rt9x5/arm-linux-uclibcgnueabi/usr --enable-threads --disable-decimal-float \
    --with-float=soft --with-abi=aapcs-linux --with-arch=armv5te --with-tune=arm926ej-s \
    --with-pkgversion='Buildroot 2011.05-dirty' \
    --with-bugurl=http://bugs.buildroot.net/ : (reconfigured) /home/ldsh/rt9x5/linux/buildroot/buildroot/output/toolchain/gcc-4.3.5/configure \
    --prefix=/opt/rt9x5/arm-linux-uclibcgnueabi/usr --build=i686-pc-linux-gnu --host=i686-pc-linux-gnu \
    --target=arm-unknown-linux-uclibcgnueabi --enable-languages=c,c++ \
    --with-sysroot=/opt/rt9x5/arm-linux-uclibcgnueabi/usr/arm-unknown-linux-uclibcgnueabi/sysroot \
    --with-build-time-tools=/opt/rt9x5/arm-linux-uclibcgnueabi/usr/arm-unknown-linux-uclibcgnueabi/bin \
    --disable-__cxa_atexit --enable-target-optspace --disable-libgomp --with-gnu-ld --disable-libssp \
    --disable-multilib --disable-tls --enable-shared --with-gmp=/opt/rt9x5/arm-linux-uclibcgnueabi/usr \
    --with-mpfr=/opt/rt9x5/arm-linux-uclibcgnueabi/usr --enable-threads --disable-decimal-float \
    --with-float=soft --with-abi=aapcs-linux --with-arch=armv5te --with-tune=arm926ej-s \
    --with-pkgversion='Buildroot 2011.05-dirty' --with-bugurl=http://bugs.buildroot.net/
    Thread model:posix
    gcc version 4.3.5 (Buildroot 2011.05-dirty) 
    

    编译命令:

    arm-linux-gcc -g 1.c
    

    宿主

    zodiac1111@debian:tmp$ uname -a
    Linux debian 3.12-1-686-pae #1 SMP Debian 3.12.9-1 (2014-02-01) i686 GNU/Linux
    

    # uname -a
    Linux AT91SAM9-RT9x5 2.6.39 #25 Mon Dec 30 17:40:40 CST 2013 armv5tejl GNU/Linux
    

    复制到目标后,然后:

    # ls -l
    total 1
    -rwxr--r--    1 ftp      83            6094 Feb 21 15:19 a.out
    

    执行正常

    # ./a.out 
    i=0
    i=1
    i=2
    

    目标gdb版本

    # gdb -v
    
    
    dlopen failed on 'libthread_db.so.1' - File not found
    GDB will not be able to debug pthreads.
    
    GNU gdb 6.8
    Copyright (C) 2008 Free Software Foundation, Inc.
    License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
    This is free software: you are free to change and redistribute it.
    There is NO WARRANTY, to the extent permitted by law.  Type "show copying"
    and "show warranty" for details.
    This GDB was configured as "arm-unknown-linux-uclibcgnueabi".
    

    调试a.out

    # gdb a.out 
    <...>
    (gdb) list
    1   1.c: No such file or directory.
        in 1.c
    (gdb) break main 
    Breakpoint 1 at 0x847c: file 1.c, line 8.
    (gdb) run 
    Starting program: /data/a.out 
    
    Breakpoint 1, main () at 1.c:8
    8   in 1.c
    (gdb) step
    9   in 1.c
        (gdb) p i
    $1 = 0
    (gdb) step
    i=0
    8   in 1.c
    (gdb) p i
    $2 = 0
    (gdb) step
    9   in 1.c
    (gdb) p i
    $3 = 1
    (gdb) 
    

    如果我将源代码文件1.c复制到同一目录

    # ls -l
    -rw-r--r--    1 ftp      83             158 Feb 21 15:51 1.c
    -rwxr--r--    1 ftp      83            6094 Feb 21 15:19 a.out
    

    gdb现在可以列出源代码。

    # gdb a.out 
    <...>
    (gdb) list
    warning: Source file is more recent than executable.
    1   #include <stdio.h>
    2   #include <string.h>
    3   #include <stdlib.h>
    4   // main function
    5   int main(void)
    6   {
    7       int i;
    8       for(i=0;i<3;i++){
    9           printf("i=%d\n",i);
    10      }
    (gdb) 
    

    在主机平台,如果我

    1. 在主机平台上使用gcc -g 1.c进行编译。
    2. 重命名删除 1.c文件。
    3. 使用gdb a.out
    4. 同样的情况发生。

      zodiac1111@debian:tmp$ gdb -v
      GNU gdb (GDB) 7.6.2 (Debian 7.6.2-1)
      Copyright (C) 2013 Free Software Foundation, Inc.
      License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
      This is free software: you are free to change and redistribute it.
      There is NO WARRANTY, to the extent permitted by law.  Type "show copying"
      and "show warranty" for details.
      This GDB was configured as "i486-linux-gnu".
      For bug reporting instructions, please see:
      <http://www.gnu.org/software/gdb/bugs/>.
      zodiac1111@debian:tmp$ gcc -v
      Using built-in specs.
      COLLECT_GCC=gcc
      COLLECT_LTO_WRAPPER=/usr/lib/gcc/i486-linux-gnu/4.8/lto-wrapper
      Target: i486-linux-gnu
      Configured with: ../src/configure -v --with-pkgversion='Debian 4.8.2-14' --with-bugurl=file:///usr/share/doc/gcc-4.8/README.Bugs --enable-languages=c,c++,java,go,d,fortran,objc,obj-c++ --prefix=/usr --program-suffix=-4.8 --enable-shared --enable-linker-build-id --libexecdir=/usr/lib --without-included-gettext --enable-threads=posix --with-gxx-include-dir=/usr/include/c++/4.8 --libdir=/usr/lib --enable-nls --with-sysroot=/ --enable-clocale=gnu --enable-libstdcxx-debug --enable-libstdcxx-time=yes --enable-gnu-unique-object --disable-libmudflap --enable-plugin --with-system-zlib --disable-browser-plugin --enable-java-awt=gtk --enable-gtk-cairo --with-java-home=/usr/lib/jvm/java-1.5.0-gcj-4.8-i386/jre --enable-java-home --with-jvm-root-dir=/usr/lib/jvm/java-1.5.0-gcj-4.8-i386 --with-jvm-jar-dir=/usr/lib/jvm-exports/java-1.5.0-gcj-4.8-i386 --with-arch-directory=i386 --with-ecj-jar=/usr/share/java/eclipse-ecj.jar --enable-objc-gc --enable-targets=all --enable-multiarch --with-arch-32=i586 --with-multilib-list=m32,m64,mx32 --with-tune=generic --enable-checking=release --build=i486-linux-gnu --host=i486-linux-gnu --target=i486-linux-gnu
      Thread model: posix
      gcc version 4.8.2 (Debian 4.8.2-14) 
      

2 个答案:

答案 0 :(得分:5)

仔细阅读 documentation of GDB,尤其是source path。您想使用dir命令

此外,切换到较新的gdb(可能通过从其源代码编译gdb)。当前版本是7.7(所以6.8真的很旧)

答案 1 :(得分:0)

AFAIK您需要在目标计算机上运行源代码的副本(运行调试程序)。

另一种调试方法是在目标机器上的gdbserver下运行代码,然后从PC连接到gdbserver。 所以,首先在目标机器上执行以下操作:

gdbserver localhost:9999 a.out

然后在你的电脑上执行:

gdb a.out
target remote your-target-ip-or-name:9999
...

让我使用您的开关进行编译,然后尝试按预期在gdb列表源中列出源代码。你不能移动源或二进制文件,否则gdb将无法找到它。