Gdb 8.2 не может распознать исполняемый файл в macOS Mojave 10.14

Я получаю gdb от brew install gdb.

Содержимое исходного файла:

#include <cstdio>
int main(){
    int a = 10;
    for(int i = 0; i< 10; i++){
        a += i;
    }
    printf("%d\n",a);
    return 0;
}

Вот исполняемый файл с именем demo: https://pan.baidu.com/s/1wg-ffGCYzPGDI77pRxhyaw

Я компилирую исходный файл так:

c++ -g -o demo demo.cpp

И запускаем gdb

gdb ./demo

Но это не сработает. Он не может распознать исполняемый файл.

GNU gdb (GDB) 8.2
Copyright (C) 2018 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-darwin18.0.0".
Type "show configuration" for configuration details.
For bug reporting instructions, please see:
<http://www.gnu.org/software/gdb/bugs/>.
Find the GDB manual and other documentation resources online at:
<http://www.gnu.org/software/gdb/documentation/>.

For help, type "help".
Type "apropos word" to search for commands related to "word"...
BFD: /Users/xxx/Codes/demo: unknown load command 0x32
BFD: /Users/xxx/Codes/demo: unknown load command 0x32
"/Users/xxx/Codes/demo": not in executable format: file format not recognized

Я использую file demo, его выход demo: Mach-O 64-bit executable x86_64

Я использую file ./demo, его вывод - ./demo: Mach-O 64-bit executable x86_64

Тип c++ -v, выход:

Apple LLVM version 10.0.0 (clang-1000.10.44.2)
Target: x86_64-apple-darwin18.0.0
Thread model: posix
InstalledDir: /Library/Developer/CommandLineTools/usr/bin

запустите ./demo, его вывод будет 55 введите show configuration в gdb, он покажет:

 This GDB was configured as follows:
 configure --host=x86_64-apple-darwin18.0.0 --target=x86_64-apple-darwin18.0.0
         --with-auto-load-dir=:${prefix}/share/auto-load
         --with-auto-load-safe-path=:${prefix}/share/auto-load
         --with-expat
         --with-gdb-datadir=/usr/local/Cellar/gdb/8.2/share/gdb (relocatable)
         --with-jit-reader-dir=/usr/local/Cellar/gdb/8.2/lib/gdb (relocatable)
         --without-libunwind-ia64
         --without-lzma
         --without-babeltrace
         --without-intel-pt
         --disable-libmcheck
         --without-mpfr
         --with-python=/System/Library/Frameworks/Python.framework/Versions/2.7
         --without-guile
         --with-separate-debug-dir=/usr/local/Cellar/gdb/8.2/lib/debug (relocatable)

Кто может мне помочь ? Большое тебе спасибо !!!

Какой gdb вы используете? Как ты получил это? Вы скачали его исходный код с sourceware.org/gdb/download и скомпилировали его? Если да, то как вы его настроили? Если нет, покажите вывод show configuration в gdb. То же самое для вашего c++ (это GCC, Лязг, ....)? Покажите вывод c++ -v. Можете ли вы запустить ./demo в том же терминале? Что на выходе file ./demo?

Basile Starynkevitch 27.09.2018 07:18

Покажите, возможно, источник demo.cpp (или сделайте крошечный минимальный воспроизводимый пример). Попробуйте сначала с примером типа Привет, мир

Basile Starynkevitch 27.09.2018 07:24

Это очень похоже на sourceware.org/bugzilla/show_bug.cgi?id=13157, за исключением того, что это было исправлено в 8.2. Также обратите внимание, что есть некоторые исправления macOS, которые есть только в git master - и они необходимы, начиная, по крайней мере, с High Sierra.

Tom Tromey 27.09.2018 13:56

Кроме того, я не думаю, что кто-либо, работающий над gdb, еще пробовал Mojave. Было бы здорово сообщить об ошибке в GDB. Еще лучше было бы прикрепить исполняемый файл типа "hello world" туда, где он не работает.

Tom Tromey 27.09.2018 13:58

Пробовал как gdb 8.0, так и 8.2, та же проблема

Felipe Lima 29.09.2018 06:15

Я столкнулся с той же проблемой на своем Mac. Вы можете попробовать lldb (который отлично работает), пока кто-нибудь не решит эту проблему.

Xiaoyu Chen 02.10.2018 09:03

Я попытался удалить gdb с помощью homebrew и переустановить его из источников, следуя руководству ЗданиеОнДарвин, но та же проблема

panic 03.10.2018 23:48

Я сообщил об этой ошибке # 23746 в исходное ПО.

panic 09.10.2018 09:21

@ChrisF - Я закрыл другой вопрос, потому что считал, что это дубликат. Но, как видите, сообщество не закрыло другой вопрос как дубликат. Следовательно, в данный момент это разные вопросы.

jww 03.12.2018 10:22
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
35
9
12 737
8
Перейти к ответу Данный вопрос помечен как решенный

Ответы 8

Я решил эту проблему в Мохаве, прорежив приложение. GDB не понимает универсальных двоичных файлов. Итак, если file myapp сообщает вам, что myapp является универсальным двоичным файлом, попробуйте следующее:

lipo -thin x86_64 -output myapp-x86_64 myapp

А потом

gdb myapp-x86_64

И я нет. В частности, я получаю это сообщение: фатальная ошибка: / Library / Developer / CommandLineTools / usr / bin / lipo: входной файл (a.out) должен быть толстым файлом, если указана опция -thin

Enno 23.11.2018 13:24
Ответ принят как подходящий

Проблема в том, что clang-1000.11.45.2, распространяемый с Apple LLVM version 10.0.0, добавляет новую команду загрузки к исполняемым файлам o-mach с именем LC_BUILD_VERSION.

$ otool -l test.o
...
Load command 1
       cmd LC_BUILD_VERSION
   cmdsize 24
  platform macos
       sdk n/a
     minos 10.14
    ntools 0
...

От яблока источник:

/*
 * The build_version_command contains the min OS version on which this
 * binary was built to run for its platform.  The list of known platforms and
 * tool values following it.
 */

Таким образом, в настоящее время bfd (программа, используемая gdb для управления исполняемыми файлами) не может интерпретировать эту команду и возвращает ошибку.

В качестве временного решения вы можете отредактировать исходный код bfd, предоставляемый с помощью gdb.

Сначала загрузите исходники gdb-8.0.1 из зеркала. Затем добавьте в gdb-8.0.1/bfd/mach-o.c следующий код в строке 4649:

case BFD_MACH_O_LC_BUILD_VERSION:
break;

Наконец, внутри gdb-8.0.1/include/mach-o/loader.h в строке 189:

  BFD_MACH_O_LC_BUILD_VERSION = 0x32

Не забудьте добавить , в конце строки 188 после BFD_MACH_O_LC_VERSION_MIN_WATCHOS = 0x30).

Затем обработайте классическую компиляцию gdb, следуя инструкциям из README:

run the ``configure'' script here, e.g.:

    ./configure 
    make

To install them (by default in /usr/local/bin, /usr/local/lib, etc),
then do:
    make install

Не забудьте подписать gdb как объяснение здесь. Если вы по-прежнему получаете ошибку (os / kern) failure (0x5), просто запустите sudo gdb.

Это временное решение, чтобы дождаться исправления от команды GNU.

РЕДАКТИРОВАТЬ

Binutils-gdb обновлен, эти изменения теперь реализованы в коммите fc7b364.

Надеюсь, это будет полезно.

Как использовать коммит, в котором вы редактировали? Я загрузил исходные файлы gdb-8.2 и попытался изменить их, как это было сделано. но есть файлы, которые я не могу найти.

Q123 11.11.2018 05:15

Проблема исходит от bfd, а не непосредственно от gdb, bfd присутствует внутри пакета binutils. Вы можете получить binutils через git git clone git://sourceware.org/git/binutils-gdb.git. Следуйте инструкциям по компиляции и установке binutils, я использую gdb 8.0.1, чтобы избежать проблем с совместимостью.

panic 12.11.2018 23:02

Кто-нибудь проинформировал brew об этом обновлении? ОБНОВЛЕНИЕ: Да, discourse.brew.sh/t/…

John Greene 26.11.2018 16:18

Вероятно, мы хотим сделать проблему на GitHub: github.com/Homebrew/brew/issues

Brian 27.11.2018 17:40

? Homebrew исправил его, больше нет необходимости в дополнительных действиях.

MCCCS 03.12.2018 18:40

Правда проблема исправлена. Работает для Mojave 10.14.1 GDB 8.2 по состоянию на 04 декабря 2018 г.

j3141592653589793238 04.12.2018 18:19

Я опубликовал временную формулу заваривания, которая, похоже, работает, пока не обновит официальную формулу:

варить установить https://raw.githubusercontent.com/timotheecour/homebrew-timutil/master/gdb_tim.rb

Обновите GDB до версии 8.3. Также см. Ошибка 23728, сбой binutils в macOS 10.14 (Mojave) из-за отсутствия поддержки в трекере ошибок Binutils.

С сообщение об ошибке:

I've found the root of the issue. binutils does not handle load command 0x32 LC_BUILD_VERSION (nor 0x31 LC_NOTE, actually). They are defined in recent LLVM versions: see https://github.com/llvm-mirror/llvm/blob/master/include/llvm/BinaryFormat/MachO.def#L77

Looking at the output of objdump -private-headers there is one clear difference:

@@ -56,16 +56,18 @@ attributes NO_TOC STRIP_STATIC_SYMS LIVE
  reserved1 0
  reserved2 0
 Load command 1
-      cmd LC_VERSION_MIN_MACOSX
-  cmdsize 16
-  version 10.13
-      sdk n/a
+       cmd LC_BUILD_VERSION
+   cmdsize 24
+  platform macos
+       sdk n/a
+     minos 10.14
+    ntools 0
 Load command 2
      cmd LC_SYMTAB
  cmdsize 24

LC_VERSION_MIN_MACOSX is implemented in binutils, while LC_BUILD_VERSION is not. It is apparently new in Mojave.

GDB 8.3 еще не выпущен. Под обновлением вы подразумеваете компиляцию из последнего источника?

kevinAlbs 25.12.2018 03:59

У меня есть хорошее решение от переполнения стека, и я не знаю, почему оно работает. Вот ссылка.

Я новичок в macOS и делаю следующее:

  1. Codesign gdb 8.0.1 в High Sierra
  2. Обновление до Мохаве
  3. gdb 8.0.1 умер с BFD: /Users/xxx/Codes/demo: unknown load command 0x32
  4. Перейдите на gdb 8.2.1 и обнаружите ошибку связки ключей Unknown Error -2,147,414,007.

    Solve this by getting the certificate in Login then export it and import it into System(Delete it from Login if unable to import).

  5. Наконец, из-за каких-то ошибок он по-прежнему не работает и идет с ERROR: Unable to start debugging. Unexpected GDB output from command "-exec-run". Unable to find Mach task port for process-id 1510: (os/kern) failure (0x5). (please check gdb is codesigned - see taskgated(8)), согласно как отменить кодовый знак, что-то не так все еще существует, и ответ сообщает мне brew reinstall gdb, но он все еще не работает, я вчера позвонил.
  6. Наконец я наткнулся на эта ссылка, Я СЧАСТЛИВЫ, теперь я могу отлаживать!

Надеюсь, мое решение поможет.

Я заставил gdb работать над Мохаве:

а) получение последнего исходного архива gdb (на момент написания, ftp://sourceware.org/pub/gdb/snapshots/current/gdb-weekly-8.2.50.20190212.tar.xz) - среди прочего, он добавляет обработку для распознавания исполняемых файлов на Mac.

б) построить gdb. У меня возникли ошибки затенения переменных в darwin-nat.c, поэтому я отредактировал файл и перестроил.

c) выполните шаги в https://forward-in-code.blogspot.com/2018/11/mojave-vs-gdb.html

Вуаля.

(источник: GDB на Mac / Mojave: во время запуска программа прерывается сигналом?, Неизвестный сигнал)

gdb 8.2, установленный из Homebrew, несовместим с Mac mojave. У меня обновление до 8.2.1. Вопрос должен быть решен.

Ответ от timotheecour выше сработал для меня:

варить установить https://raw.githubusercontent.com/timotheecour/homebrew-timutil/master/gdb_tim.rb

Затем мне пришлось сгенерировать самоподписанный сертификат, как в https://www.thomasvitale.com/how-to-setup-gdb-and-eclipse-to-debug-c-files-on-macos-sierra/

Другие вопросы по теме