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)
誰が私を助けることができます ?どうもありがとうございました !!!
問題は、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 で実装されるようになりました。
役に立てば幸いです。
公式の抽出式が更新されるのを待っている間に、動作するように見える一時的な抽出式を公開しました。
brew install https://raw.githubusercontent.com/timotheecour/homebrew-timutil/master/gdb_tim.rb
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の新機能のようです。
私はスタックオーバーフローから私にとって良い解決策を手に入れましたが、なぜそれが機能するのか分かりません。 リンク です。
私はmacOSを初めて使用し、次のことを行います。
BFD: /Users/xxx/Codes/demo: unknown load command 0x32
で死亡しましたUnknown Error -2,147,414,007
。が発生しますこれを解決するには、
Login
の証明書を取得し、それをエクスポートしてSystem
にインポートします(インポートできない場合は、ログインから削除します)。
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日と呼びました。私のソリューションが役立つことを願っています。
homebrewからインストールされたgdb 8.2は、Mac mojaveと互換性がありません。 8.2.1にアップグレードしました。問題を解決する必要があります。
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 の手順に従います
出来上がり。