web-dev-qa-db-ja.com

gdb 8.2はmacOS Mojave 10.14で実行可能ファイルを認識できません

brew install gdbでgdbを取得します。

ソースファイルの内容は次のとおりです。

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

「デモ」という名前の実行可能ファイルは次のとおりです。 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

gdbで./demoを実行すると、その出力は55 type show configurationになります。

 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)

誰が私を助けることができます ?どうもありがとうございました !!!

33
food far

問題は、clang-1000.11.45.2とともに配布されるApple LLVM version 10.0.0が、LC_BUILD_VERSIONという名前のo-mach実行可能ファイルに新しいロードコマンドを追加することです。

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

Appleから ソース

/*
 * 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でのみテストしました。

まず、 mirrors からgdb-8.0.1ソースをダウンロードします。次に、gdb-8.0.1/bfd/mach-o.cの次のコードを4649行に追加します。

case BFD_MACH_O_LC_BUILD_VERSION:
break;

そして最後にint gdb-8.0.1/include/mach-o/loader.hを追加します:

  BFD_MACH_O_LC_BUILD_VERSION = 0x32

189,の後の行188の最後にBFD_MACH_O_LC_VERSION_MIN_WATCHOS = 0x30を追加することを忘れないでください)。

これらの指示の後、README内に示すように、古典的なgdbコンパイルに従うことができます。

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

Explain here としてgdbに署名することを忘れないでください。それでも(os/kern)エラー(0x5)エラーが表示される場合は、Sudo gdbを実行するだけです。

これは、GNUチームがレポで直接問題を修正するのを待つ一時的な解決策です。

編集

Binutils-gdbが更新され、これらの変更はcommit fc7b364 で実装されるようになりました。

役に立てば幸いです。

12
Lilrom

公式の抽出式が更新されるのを待っている間に、動作するように見える一時的な抽出式を公開しました。

brew install https://raw.githubusercontent.com/timotheecour/homebrew-timutil/master/gdb_tim.rb

2
timotheecour

GDBバージョン8.3にアップグレードします。また、Binutilsバグトラッカーの 問題23728、unimplが原因でmacOS 10.14(Mojave)でbinutilsが失敗する も参照してください。

バグレポート から:

私は問題の根本を見つけました。 binutilsは、ロードコマンド0x32 LC_BUILD_VERSIONを処理しません(実際には0x31 LC_NOTEでもありません)。これらは最近のLLVMバージョンで定義されています: https://github.com/llvm-mirror/llvm/blob/master/include/llvm/BinaryFormat/MachO.def#L77 を参照してください

Objdump -private-headersの出力を見ると、明らかな違いが1つあります。

@@ -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はbinutilsに実装されていますが、LC_BUILD_VERSIONは実装されていません。 Mojaveの新機能のようです。

1
jww

私はスタックオーバーフローから私にとって良い解決策を手に入れましたが、なぜそれが機能するのか分かりません。 リンク です。

私はmacOSを初めて使用し、次のことを行います。

  1. High SierraのCodesign gdb 8.0.1
  2. Mojaveへの更新
  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。が発生します

    これを解決するには、Loginの証明書を取得し、それをエクスポートしてSystemにインポートします(インポートできない場合は、ログインから削除します)。

  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))が付属しています。 codesignを元に戻す方法 に従って、何か問題がまだ存在し、答えはbrew reinstall gdb、それでもまだ動作しません、昨日それを1日と呼びました。
  6. 最後に私は そのリンク に出くわしました、私はHAPPYYです、今ではデバッグできます!

私のソリューションが役立つことを願っています。

0
Karl Han

homebrewからインストールされたgdb 8.2は、Mac mojaveと互換性がありません。 8.2.1にアップグレードしました。問題を解決する必要があります。

0
Pin

Mojaveでgdbを動作させるには:

a)最新のgdbソースアーカイブの取得(執筆時、 ftp://sourceware.org/pub/gdb/snapshots/current/gdb-weekly-8.2.50.20190212.tar.xz )-とりわけ、Macで実行可能ファイルを認識するための処理が追加されます。

b)gdbをビルドします。 darwin-nat.cで変数シャドウイングのエラーが発生したため、ファイルを編集して再構築しました。

c) https://forward-in-code.blogspot.com/2018/11/mojave-vs-gdb.html の手順に従います

出来上がり。

(ソース: Mac/Mojave上のGDB:起動プログラムがシグナル?、不明なシグナルで終了したとき

0
Joubert Nel