gdb无法加载源文件?

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

我的问题:

gdb一直如此,还是有其他的select我可以控制?

你有什么build议来debugging程序?

我为我可怜的英语感到抱歉

一些信息可能有用:

源代码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". 

debugginga.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) pi $1 = 0 (gdb) step i=0 8 in 1.c (gdb) pi $2 = 0 (gdb) step 9 in 1.c (gdb) pi $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

同样的情况发生。

 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) 

Solutions Collecting From Web of "gdb无法加载源文件?"

仔细阅读有关源路径 的GDB文档 。 你想使用dir命令

另外,切换到一个新的gdb(也许通过编译源代码gdb )。 目前的版本是7.7(所以6.8真的很老)

AFAIK你需要在目标机器上运行调试器的源代码副本。

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

 gdbserver localhost:9999 a.out 

然后在你的电脑上做:

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

对于我编译与您的开关,然后尝试列出源代码如预期的gdb列表源。 你不能移动源代码或二进制文件,否则gdb将无法找到它。