Ответ 1
Исполняемый файл является 64-разрядным (x86-64), а отладчик представляет собой 32-битную (i686-pc-linux) сборку. Возможно, вам потребуется установить 64-разрядную (x86-64) версию отладчика.
Я пытаюсь использовать GDB для отладки (чтобы найти раздражающий segfault). Когда я запускаю:
gdb ./filename
из командной строки, я получаю следующую ошибку:
This GDB was configured as "i686-pc-linux-
gnu"..."/path/exec": not in executable
format: File format not recognized
Когда я выполняю:
file /path/executable/
Я получаю следующую информацию:
ELF 64-bit LSB executable, AMD x86-64,
version 1 (SYSV), for GNU/Linux 2.4.0,
dynamically linked (uses shared libs), not stripped
Я использую GDB 6.1, а исполняемый файл скомпилирован с версией gcc версии 3.4.6.
Я немного из воды с точки зрения использования gdb, но насколько я могу судить, он должен работать в этом случае. Любые идеи, что происходит не так?
Исполняемый файл является 64-разрядным (x86-64), а отладчик представляет собой 32-битную (i686-pc-linux) сборку. Возможно, вам потребуется установить 64-разрядную (x86-64) версию отладчика.
Я не уверен, что это ваша проблема, но я часто сталкивался с этой ситуацией. Исполняемый файл дерева сборки, созданный make/automake, не является двоичным, а script, поэтому вы не можете использовать gdb. Попробуйте установить приложение и изменить каталог, потому что else gdb пытается отладить script.
Вопрос относится к "./filename" и к "/path/executable". Это тот же файл?
Если вы выполняете анализ после вскрытия, вы будете запускать:
gdb executable-file core-file
Если вы проигнорируете основной файл, вы запустите:
gdb executable-file
В обоих случаях "executable-file
" означает путь к двоичному файлу, который вы хотите отлаживать. Как правило, это фактически простое имя файла в текущем каталоге, так как у вас есть исходный код из вашей сборки отладки.
В Solaris предполагается, что 64-разрядная сборка GDB сможет отлаживать как 32-разрядные, так и 64-разрядные исполняемые файлы (хотя у меня были некоторые проблемы с последними версиями GDB). Я не уверен в обратном - что 32-разрядный GDB может обязательно отлаживать 64-разрядные исполняемые файлы.
Что нужно проверить, это действительно библиотека bfd. Библиотека binary file descriptor - это то, что binutils/gdb использует для фактического анализа и обработки двоичных файлов (ELF/a.out и т.д.).
Вы можете видеть текущие поддерживаемые платформы через 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
Кажется, ваш отладчик GNU (gdb
) не поддерживает архитектуру x86_64.
Итак, попробуйте LLDB Debugger (lldb
), целью которого является его замена. Он поддерживает наборы инструкций i386, x86-64 и ARM.
Он доступен по умолчанию для BSD/OS X, в Linux устанавливается через: sudo apt-get install lldb
(или используйте yum
).
Подробнее см. gdb to lldb command map.