Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

GDB won't load source file

Tags:

linux

gcc

gdb

  1. I'm using arm-linux-gcc to compile a simple C file at host (debian i386) with -g.
  2. Then copy the a.out file to the target (arm,uclibc) computer.
  3. Run the a.out – it's just ok.
  4. Use GDB (target) gdb a.out and list the source code, it says No such file or directory. The fact has always been so?
  5. If I copy the 1.c file to the target, then list command it lists the source code.

My Question:

GDB has always been so, or there are other options I can control?

Do you have any suggestions to debug the program?

Some information maybe is useful:

source code 1.c file:

#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;
}

cross compile version(host)

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) 

compile command:

arm-linux-gcc -g 1.c

host:

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

target:

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

after copy to the target,then:

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

execute is ok

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

the target gdb version

# 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".

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

if I copy the source code file 1.c into the same directory

# 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 could list the source code now.

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

At host Platform,if I

  1. compile with gcc -g 1.c at host platform.
  2. than rename or remove the 1.c file.
  3. Usegdb a.out

The same situation occurs.

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) 
like image 349
zodiac1111 Avatar asked Feb 21 '14 08:02

zodiac1111


2 Answers

Read carefully the documentation of GDB notably about source path. You want to use the dir command

Also, switch to a newer gdb (perhaps by compiling gdb from its source code). Current version is 7.7 (so 6.8 is really old)

like image 50
Basile Starynkevitch Avatar answered Oct 04 '22 13:10

Basile Starynkevitch


AFAIK you need a copy of source on your target machine (where you run the debugger).

Another way to debug this is to run your code under gdbserver on target machine, then connect to gdbserver from your PC. So, first on target machine do something like:

gdbserver localhost:9999 a.out

Then on your PC do:

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

For me compiling with your switches and then trying to list source in gdb lists source as expected. You must not move source or binary around, or gdb will not be able to locate it.

like image 40
dbrank0 Avatar answered Oct 04 '22 12:10

dbrank0