「gdbがコード署名されていることを確認してください-taskgated(8)を参照してください」-自作のコードが署名されたgdbをインストールする方法


107

私はosx 10.8.4の下にあり、homebrewを使用してgdb 7.5.1をインストールしました(動機は--with-pythonなどの新しい機能を備えた新しいgdbを取得します...)

私が得るc ++ Eclipseプロジェクト内でデバッグを実行すると、長い話は短くなります:

Error in final launch sequence
Failed to execute MI command:
-exec-run
Error message from debugger back end:
Unable to find Mach task port for process-id 46234: (os/kern) failure (0x5).
 (please check gdb is codesigned - see taskgated(8))
Unable to find Mach task port for process-id 46234: (os/kern) failure (0x5).
 (please check gdb is codesigned - see taskgated(8))

コード署名に関するさまざまな提案に従いました

だから私はしました:

  1. 証明書を設定する
  2. gdbに署名-> codesign -s gdb-cert / usr / local / bin / gdb

Eclipseでデバッグを再実行すると、上記と同じエラーが発生します(「gdbがコード署名されていることを確認してください-taskgated(8)を参照してください)」。

gdbを以前のgdb(Eclipseのgdb設定)/ usr / libexec / gdb / gdb-i386-apple-darwinに戻した場合、デバッグは期待どおりに実行されます。

そこに解決策/ヒントはありますか?

どうも

ペレ


これは「セキュリティ機能」ではありませんか?つまり、システムは正式に署名されたソフトウェアのみを受け入れるように構成されていますか?もしそうなら、うまくいけば、その機能をオフにする方法があります...
Mats Petersson 2013

あなたのフィードバックのために[OK]をありがとう-私はあなたのセキュリティの特徴点を理解しますが、私の問題は、署名を行うにはどのようにしている...同様のポストがありstackoverflow.com/questions/12050257/gdb-fails-on-mountain-lionのdidn」をtまだ解決してくれません
pelekrogholt 2013

回答:


136

このエラーは、OSXが、バイナリが他のプロセスのpidにアクセスするためのデジタル署名を必要とするpidアクセスポリシーを実装しているために発生します。他のプロセスへのgdbアクセスを有効にするには、まずバイナリにコード署名する必要があります。この署名は、ユーザーが作成してシステムに登録する必要がある特定の証明書に依存します。

コード署名証明書を作成するには、キーチェーンアクセスアプリケーションを開きます。[キーチェーンアクセス]-> [証明書アシスタント]-> [証明書の作成]メニューを選択します。

証明書の名前(gdb-certなど)を選択し、[IDの種類]を[自己署名ルート]に設定し、[証明書の種類]を[コード署名]に設定して、[デフォルトを上書きする]を選択します。[証明書の場所の指定]画面が表示されるまで[続行]を数回クリックし、キーチェーンを[システム]に設定します。

証明書をダブルクリックし、[信頼]セクションを開いて、コード署名を[常に信頼する]に設定します。キーチェーンアクセスアプリケーションを終了します。

taskgatedサービスを再起動し、バイナリに署名します。

$ sudo killall taskgated
$ codesign -fs gdb-cert "$(which gdb)"

ソースhttp://andresabino.com/2015/04/14/codesign-gdb-on-mac-os-x-yosemite-10-10-2/

macOS 10.12(Sierra)以降では、

gdb 7.12.1以降を使用します。さらに、gdbがデバッグするプログラムを開始するためにシェルを使用するのを防ぎます。これにはgdb内で次のコマンドを使用できます。

set startup-with-shell off

この最後のコマンドをホームディレクトリの.gdbinitというファイルに置くこともできます。この場合、gdbを起動するたびに自動的に適用されます。

echo "set startup-with-shell off" >> ~/.gdbinit

出典:https : //sourceware.org/gdb/wiki/BuildingOnDarwin


6
魅力のように機能します。ありがとうございました。
pceccon 2015年

14
OPが指摘したように、これは彼にとっては(そして私にとっても)トリックを実行しませんでした。
PVitt

6
macOS Sierra自己署名証明書では機能しないようです。
loretoparisi 2017

sudo killall taskgated私の問題を解決するための鍵です
Karthikeyan Vaithilingam 2017

私は手順を正確に実行しましたが、これはmacOS Sierraで私にとって美しく機能しました。
jdg 2017

29

この方法でコード署名せずにgdbをOSX 10.9で動作させました(ここで説明):

  1. macportsでgdbをインストールします。(あなたはそれをスキップできるかもしれません)

  2. sudo nano /System/Library/LaunchDaemons/com.apple.taskgated.plist

    オプション文字列を22行目の27 列目から-sに変更します-sp

  3. コンピュータを再起動します。

  4. gdbを使用します。Macポートでインストールした場合は、ggdbコマンドを使用する必要があります。または、設定ファイルにエイリアスを作成しました:

alias gdb='ggdb'

そして 'gdb'コマンドを使用します。


私はしばらくの間この問題に遭遇しており、他のハウツーが役に立たないことがわかりました。これは魅力のように働きました。
Bill DeRose

@BillDeRose、私にとっても同じです。
klm123 2013

@nimrodm、あなたは「sudo gdb」を意味しますか?macportsを使用した場合は「ggdb」である必要があります
klm123 '21

1
ああ。gdbとして実行する必要はありませんsudo。これは、不要なセキュリティリスクのようです。
Autumnsault 2014年

2
コンピュータを再起動しません。何かを再起動するコマンドが必要です!
Michael

27

にアップグレードしましたがgdb 8.3、機能させることができませんでした。これは私を助けました:

codesign --entitlements gdb.xml -fs gdb-cert /usr/local/bin/gdb

内容gdb.xmlは次のとおりです。

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN"
"http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>com.apple.security.cs.allow-jit</key>
    <true/>
    <key>com.apple.security.cs.allow-unsigned-executable-memory</key>
    <true/>
    <key>com.apple.security.cs.allow-dyld-environment-variables</key>
    <true/>
    <key>com.apple.security.cs.disable-library-validation</key>
    <true/>
    <key>com.apple.security.cs.disable-executable-page-protection</key>
    <true/>
    <key>com.apple.security.cs.debugger</key>
    <true/>
    <key>com.apple.security.get-task-allow</key>
    <true/>
</dict>
</plist>

私はこの解決策をここに見つけました:https : //timnash.co.uk/getting-gdb-to-semi-reliably-work-on-mojave-macos/

注:エンタイトルメントがないと、でgdbのみ実行できましたsudo


2
何が起きた場合error: The specified item could not be found in the keychain.
Sridhar Sarnobat

@SridharSarnobatこの回答の最初にパイプラインを使用するstackoverflow.com/a/32727069/339146
Panayotis

@maximserの回答を試行した後、失敗しました。その後、これは私のために働きます。macOS 10.15.4、gdb 9.2はbrew経由でインストールされます。
ウィーミング

@SridharSarnobat:あなたが証明書最初に作成する必要がstackoverflow.com/questions/35020236/...
Akansha

26

GDBでも同じ問題が発生しました。私はMac OS X 10.8.5別名マウンテンライオンの下で実行しています。GDBバージョンを使用してい7.7.1ます。

次のコマンドでテストプログラムをコンパイルしました。

g++ -o gdb-sample.out -g gdb-sample.cpp    

コマンドを入力するとgdb sample.out、同じ不可解なエラーメッセージが表示されます。

"Unable to find Mach task port for process-id 46234: (os/kern) failure (0x5). (please check gdb is codesigned - see taskgated(8))"

ただし、このエラーメッセージは赤のニシンです。

私がうまくいったことがわかった解決策は、スーパーユーザーacctを使用してGDBを呼び出すことでした。

sudo gdb sample.out. 

それは私にとってはうまくいきます。

その時点から、sudoを使用せずにGDB example.outを実行できました。

これが他の人のために役立ち、うまくいくことを願っています。そうでない場合、RSVP。


1
なぜこれが反対票だったのかわからない。rootとして(sudoを使用して)コマンドを実行し、それが機能しました。
iProgram

6

これはどれも私にとってはうまくいかなかったので、長い目で見なければなりませんでした。これを機能させるために私が実行した手順の完全なリストを次に示します。

  1. gdbに署名するための証明書を作成します。

残念ながら、システム証明書は私に与えました Unknown Error = -2,147,414,007は非常に役立ちますので、回避策を講じる必要がありました。 KeyChain Assistant -> Create certificate ->

選んでlogingdb-certCode Signing

証明書をシステムキーチェーンにコピー/移動(パスワードを入力)

  1. 証明書を選択(gdb-cert)クリックGet info->Trust Always
  2. 無効にする startup-with-shell

コンソールに入力: set startup-with-shell off

設定を覚えておいてください: echo "set startup-with-shell off" >> ~/. gdbinit

  1. ルートユーザーを有効にする

行くSystem Preferences- > Users & Groups- > Unlock it- > Login Options- > Network Account Server- > Join- > Unlock it> - Edit(メニュー) - >Enable Root User

  1. sudo killall taskgated
  2. 最後にgdbに署名する

codesign -fs gdb-cert "$(which gdb)"

  1. rootユーザーを無効にする(ステップ4)
  2. それでも機能しない場合は、再起動します。(他に何も機能しない場合は、おそらくすでに機能しています)

PS。lldbうまくいくので使ってしまいます(チュートリアル


5

Sierra 10.12.6(およびそれ以上)とHomebrewを使用している人にとって/usr/local/bin/gdbは、/usr/local/Cellar/gdb/8.0/bin/gdb(または任意のバージョン、たとえば8.0.1)です。

リンクとターゲットの両方にコード署名する必要があります。

codesign -fs gdb-cert /usr/local/bin/gdb
codesign -fs gdb-cert "/usr/local/Cellar/gdb/8.0/bin/gdb"

または、greadlink(を介してインストールしたbrew install coreutils)場合:

codesign -fs gdb-cert $(which gdb)
codesign -fs gdb-cert $(greadlink -f $(which gdb))

1
ハイシエラでこれを試しましたか?O / S:10.13.6で動作しませんでした
rustyMagnet

3

ここでの最高得票数の世界的な変化が意図しない結果をもたらすのはないかと思います。

古いTiger規約を有効にするのではなく、taskgatedは署名されたコードの実行を許可します。したがって、ここで回答と同様に、gdbの署名付き証明書を取得することをお勧めします

この後、sudogdb を使用することができました。sudoを使用せずにgdbを使用する必要がある場合は、おそらくこのリンクが役立つでしょう、免責事項、使用することは今のところ問題ないsudoソリューションであるため、私はまだ試していません。


3

これは関連していない可能性があります。macosでは、gdbの代わりにlldbを使用できます。gdbをインストールするのにこの手間は必要ありません。

lldb(http://lldb.llvm.org)はデフォルトでHigh Sierraにすでにインストールされています


0

この要点に従うことをお勧めします:https : //gist.github.com/gravitylow/fb595186ce6068537a6e9da6d8b5b96d#file-codesign_gdb-md

克服するトリック:unknown error = -2,147,414,007ここで説明する証明書の作成中:https : //apple.stackexchange.com/a/309123

ノート:

homebrewパッケージとしてインストールされるgdbのパスは次のようになります。/usr/local/Cellar/gdb/9.2/bin/gdb

そして csrutil enable --without debugrequesting unsupported configuration、次のようなに関するメッセージが表示されます:https : //totalfinder.binaryage.com/system-integrity-protection

テスト:

  sw_vers -productVersion
10.13.6

  gdb ./a.out
GNU gdb (GDB) 9.2
...
Thread 3 hit Breakpoint 1, main () at main.c:14
14          data_t d = {0};

-1

gdb 8.3;

私の問題は上記の人と同じで、解決されました

codesign --entitlements gdb.xml -fs gdb-cert /usr/local/bin/gdb
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.