2008-11-09 14 views
13

Estoy tratando de usar GDB para depurar (para encontrar una segfault molesto). Cuando corro:gdb no ejecuta el programa ELF de 64 bits con "Formato de archivo no reconocido"

gdb ./filename 

desde la línea de comandos, me sale el siguiente error:

This GDB was configured as "i686-pc-linux- 
gnu"..."/path/exec": not in executable 
format: File format not recognized 

Cuando ejecuto:

file /path/executable/ 

consigo la siguiente información:

ELF 64-bit LSB executable, AMD x86-64, 
version 1 (SYSV), for GNU/Linux 2.4.0, 
dynamically linked (uses shared libs), not stripped 

Estoy usando GDB 6.1, y th e ejecutable se compila con la versión 3.4.6 de gcc.

Estoy un poco fuera de mi agua en términos de usar gdb, pero hasta donde sé, debería funcionar en esta instancia. Alguna idea de lo que va mal?

Respuesta

21

El ejecutable es de 64 bits (x86-64) y el depurador es una compilación de 32 bits (i686-pc-linux). Es posible que deba instalar una versión de 64 bits (x86-64) del depurador.

+1

gracias. Pensé que este podría ser el problema, y ​​resulta que hay una versión de 64 bits de gdb instalada en una ruta más oscura en la misma máquina. – pbh101

+1

Gracias - Tuve este problema después de instalar el paquete debian gdb: i386 y algunos otros hace unos días para evitar crear un chroot para construir una versión i386 de un paquete Debian. – frankster

+0

Eso fue lo mismo para mí cuando no pude depurar una aplicación de Android de QtCreator. 32bit gdbserver se usó mientras tenía un dispositivo android de 64 bits – rightaway717

4

La pregunta se refiere a "./filename" y a "/ ruta/ejecutable". ¿Son estos el mismo archivo?

Si usted está haciendo un análisis post-mortem, deberá ejecutar:

gdb executable-file core-file 

Si va a ignorar el archivo central, debe ejecutar:

gdb executable-file 

En ambos casos, 'executable-file' significa una ruta de acceso al binario que desea depurar. Por lo general, en realidad es un nombre de archivo simple en el directorio actual, ya que tiene allí el código fuente de su compilación de depuración.

En Solaris, se supone que una compilación de 64 bits de GDB puede depurar ejecutables de 32 y 64 bits (aunque he tenido algunos problemas con versiones recientes de GDB). No estoy seguro de lo contrario: que un GDB de 32 bits necesariamente puede depurar ejecutables de 64 bits.

5

No estoy seguro de si este es su problema, pero me enfrenté a esta situación muy a menudo. El ejecutable en el árbol de compilación, compilado por make/automake no es un archivo binario, sino un script, por lo que no puede usar gdb con él. Intente instalar la aplicación y cambie el directorio, porque else gdb intenta depurar el script.

+0

Este no es mi problema, pero es algo que revisé. Gracias por la ayuda. Por lo que puedo decir, puedes ejecutar 'file' en el ejecutable para ver si es un archivo binario. – pbh101

+0

@quinmars puede explicar un poco más lo que quiere decir con 'Intentar instalar la aplicación y cambiar el directorio', acabo de tener el mismo problema, al verificar el tipo de archivo era 'POSIX shell script' –

+1

@HadyElsahar With * instalar * Quise decir 'make install'. Pero una instalación realmente no es necesaria. Siga la explicación aquí: https://www.sourceware.org/autobook/autobook/autobook_53.html#Executing-Uninstalled-Binaries – quinmars

2

Lo que necesita comprobar, en realidad es la biblioteca de bfd. La biblioteca binary file descriptor es lo que binutils/gdb usa para analizar y manejar binarios (ELF/a.out, etc.).

Puede ver las plataformas actuales compatibles a través de objdump;

# objdump -H 

objdump: supported targets: elf32-powerpc aixcoff-rs6000 elf32-powerpcle ppcboot elf64-powerpc elf64-powerpcle elf64-little elf64-big elf32-little elf32-big srec symbolsrec tekhex binary ihex 
objdump: supported architectures: rs6000:6000 rs6000:rs1 rs6000:rsc rs6000:rs2 powerpc:common powerpc:common64 powerpc:603 powerpc:EC603e powerpc:604 powerpc:403 powerpc:601 powerpc:620 powerpc:630 powerpc:a35 powerpc:rs64ii powerpc:rs64iii powerpc:7400 powerpc:e500 powerpc:MPC8XX powerpc:750 

The following PPC specific disassembler options are supported for use with 
the -M switch: 
    booke|booke32|booke64 Disassemble the BookE instructions 
    e300      Disassemble the e300 instructions 
    e500|e500x2    Disassemble the e500 instructions 
    efs      Disassemble the EFS instructions 
    power4     Disassemble the Power4 instructions 
    power5     Disassemble the Power5 instructions 
    power6     Disassemble the Power6 instructions 
    32      Do not disassemble 64-bit instructions 
    64      Allow disassembly of 64-bit instructions 
1

Parece que su depurador de GNU (gdb) no es compatible con la arquitectura x86_64.

Pruebe LLDB Debugger (lldb) cuyo objetivo es reemplazarlo. Admite conjuntos de instrucciones i386, x86-64 y ARM.

Está disponible de manera predeterminada en BSD/OS X, en la instalación de Linux a través de: sudo apt-get install lldb (o use yum).

Ver: gdb to lldb command map página para obtener más información.

Cuestiones relacionadas