arm-linux-gcc
comstackr un simple fichier c sur l’hôte (debian i386) avec -g
. a.out
sur l’ordinateur cible (arm, uclibc). a.out
est juste ok. gdb a.out
et listez le code source, il indique No such file or directory
. Le fait a toujours été ainsi? 1.c
dans la cible, alors la commande list contient le code source. Ma question:
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
gcc -g 1.c
sur la plateforme hôte. 1.c
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.