gdb ne peut pas charger le fichier source?

  1. J’utilise juste arm-linux-gcc comstackr un simple fichier c sur l’hôte (debian i386) avec -g .
  2. Ensuite, copiez le fichier a.out sur l’ordinateur cible (arm, uclibc).
  3. Exécuter le a.out est juste ok.
  4. Utilisez gdb (terget) gdb a.out et listez le code source, il indique No such file or directory . Le fait a toujours été ainsi?
  5. Si je copie le fichier 1.c dans la cible, alors la commande list contient le code source.

Ma question:

gdb a toujours été ainsi, ou il y a d’autres options que je peux contrôler?

Avez-vous des suggestions pour déboguer le programme?

Je suis désolé pour mon pauvre anglais

Certaines informations peuvent être utiles:

fichier code source 1.c :

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

version de compilation croisée (hôte)

 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) 

commande de compilation:

 arm-linux-gcc -g 1.c 

hôte:

 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 

cible:

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

après copie à la cible, alors:

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

exécuter est ok

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

la version cible de 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  This is free software: you are free to change and redissortingbute 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". 

debug 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) 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) 

si je copie le fichier de code source 1.c dans le même répertoire

 # 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 pourrait lister le code source maintenant.

 # gdb a.out  (gdb) list warning: Source file is more recent than executable. 1 #include  2 #include  3 #include  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) 

À la plate-forme hôte, si je

  1. comstackr avec gcc -g 1.c sur la plateforme hôte.
  2. que renommer ou supprimer le fichier 1.c
  3. Utilisez gdb a.out

La même situation se produit.

 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  This is free software: you are free to change and redissortingbute 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: . 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) 

Lisez attentivement la documentation de GDB notamment sur le chemin source . Vous voulez utiliser la commande dir

Passez également à un fichier gdb plus récent (peut-être en compilant gdb partir de son code source). La version actuelle est 7.7 (donc 6.8 est vraiment ancienne)

AFAIK vous avez besoin d’une copie de la source sur votre machine cible (où vous exécutez le débogueur).

Une autre façon de déboguer ceci est d’exécuter votre code sous gdbserver sur la machine cible, puis de vous connecter à gdbserver à partir de votre PC. Donc, d’abord sur la machine cible, faites quelque chose comme:

 gdbserver localhost:9999 a.out 

Ensuite, sur votre PC:

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

Pour moi, comstackr avec vos commutateurs et ensuite essayer de lister la source dans gdb répertorie la source comme prévu. Vous ne devez pas déplacer la source ou le binary, ou gdb ne pourra pas le localiser.