Gdb на mac 10.9 терпит неудачу с "не в исполняемом формате: формат файла не распознан" для 32 + 64 arch

$ file app
app: Mach-O universal binary with 2 architectures
app (for architecture i386):    Mach-O executable i386
app (for architecture x86_64):  Mach-O 64-bit executable x86_64

$ gdb app
GNU gdb (GDB) 7.6
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 "x86_64-apple-darwin13.0.0".
For bug reporting instructions, please see:
<http://www.gnu.org/software/gdb/bugs/>...
"app": not in executable format: File format not recognized


$ file test
test: Mach-O 64-bit executable x86_64

$ gdb test
GNU gdb (GDB) 7.6
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 "x86_64-apple-darwin13.0.0".
For bug reporting instructions, please see:
<http://www.gnu.org/software/gdb/bugs/>...
Reading symbols from /Users/dmulder/test...Reading symbols from /Users/dmulder/test.dSYM/Contents/Resources/DWARF/test...done.
done.

Почему бы 64-битный двоичный файл был успешным, но двоичный файл 64 + 32 завершился неудачей?

Ответ 1

К сожалению, версия GNU gdb, отличная от Apple, в настоящее время не может отлаживать универсальные (или "жирные" ) двоичные файлы (те, которые содержат как 32-разрядные, так и 64-разрядные исполняемые файлы).

Один из вариантов - использовать lipo для извлечения одной архитектуры и запускать gdb:

lipo -thin x86_64 -output app-x86_64 ./app

или

lipo -thin i386 -output app-i386 ./app

Если вы хотите отлаживать комбинированный исполняемый файл, вы можете попробовать использовать LLDB или версию Apple gdb.

Ответ 2

Как отмечает OP , использование Apple gdb устранит проблему.

Вот инструкции по сборке Apple gdb 6.3.50.20050815-cvs из источника на OS 10.9:

ПРИМЕЧАНИЕ. Вам нужно будет установить Xcode и настроить среду сборки. Если у вас установлен Homebrew, запустите brew doctor, чтобы узнать, готова ли ваша система к brew."

  • Загрузите исходный tarball gdb-1822: http://opensource.apple.com/tarballs/gdb/gdb-1822.tar.gz

  • Извлеките это во временный каталог. Откройте терминал и cd в gdb-1822/src.

  • Запустите configure script:

    ./configure --prefix="$HOME/.local/stow/gdb-1822" --disable-debug --disable-dependency-tracking --with-system-readline
    

    (Последние три аргумента configure из формулы homebrew-dupes: https://github.com/Homebrew/homebrew-dupes/blob/master/gdb.rb)

  • Запустить make:

    make
    make install
    
  • Следуйте инструкциям в https://sourceware.org/gdb/wiki/BuildingOnDarwin#Creating_a_certificate, чтобы создать сертификат подписи сертификата gdb-cert.

  • cd в $HOME/.local/stow/gdb-1822/bin и подпишите gdb исполняемый файл:

    codesign -s gdb-cert gdb
    
  • cd в $HOME/.local/stow и stow папку gdb-1822:

    stow gdb-1822
    
  • Добавьте $HOME/.local/bin в PATH и перезапустите терминал или очистить Bash кеш до местоположения gdb:

    hash -d gdb