46

Python対応が必要なためgdb、次の方法で別のバージョンをインストールしました

brew tap homebrew/dupes
brew install gdb

gdbこれをEclipseCDTで使用したいのですが、デバッグ設定でバイナリへのパスを入力しました。ただし、デバッグ用のプログラムの起動は失敗し、次のメッセージが表示されます。

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 39847: (os/kern) failure (0x5).\n (please check gdb is codesigned - see taskgated(8))
Unable to find Mach task port for process-id 39847: (os/kern) failure (0x5).\n (please check gdb is codesigned - see taskgated(8))

この文脈で「共同設計」とはどういう意味ですか?どうすればこれgdbを実行できますか?

4

10 に答える 10

97

I.1デバッガーの共同設計

Darwinカーネルでは、デバッガーが他のプロセスを制御できるようになる前に、特別なアクセス許可が必要です。これらのアクセス許可は、GDB実行可能ファイルにコード署名することで付与されます。これらの権限がないと、デバッガーは次のようなエラーメッセージを報告します。

Starting program: /x/y/foo
Unable to find Mach task port for process-id 28885: (os/kern) failure (0x5).
 (please check gdb is codesigned - see taskgated(8))

共同設計には証明書が必要です。次の手順では、作成方法について説明します。

  • キーチェーンアクセスアプリケーションを起動します(/Applications/Utilities/KeychainAccess.app内)
  • [キーチェーンアクセス]->[証明書アシスタント]->[証明書の作成...]メニューを選択します
  • それで:
    • 新しい証明書の名前を選択します(この手順では、例として「gdb-cert」を使用します)
    • 「IDタイプ」を「自己署名ルート」に設定します
    • 「証明書の種類」を「コード署名」に設定します
    • [デフォルトを上書きする]オプションを有効にします
  • [証明書の場所を指定]画面が表示されるまで[続行]を数回クリックし、[キーチェーン]を[システム]に設定します
  • 証明書が作成されるまで「続行」をクリックします
  • 最後に、ビューで新しい証明書をダブルクリックし、[この証明書を使用する場合]を[常に信頼する]に設定します
  • キーチェーンアクセスアプリケーションを終了し、コンピューターを再起動します(これは残念ながら必要です)

証明書が作成されると、デバッガーは次のようにコード署名できます。ターミナルで、次のコマンドを実行します...

codesign -f -s  "gdb-cert"  <gnat_install_prefix>/bin/gdb

...ここで、「gdb-cert」は上記で選択した実際の証明書名に置き換え、GNATをインストールした場所に置き換える必要があります。

ソース:https ://gcc.gnu.org/onlinedocs/gcc-4.8.1/gnat_ugn_unw/Codesigning-the-Debugger.html

更新: High-Sierra(証明書アシスタント-不明なエラー) https://apple.stackexchange.com/questions/309017/unknown-error-2-147-414-007-on-creating-certificate-with-certificate-assist

于 2014-09-05T04:15:59.417 に答える
5

証明書の信頼を確認します。コード署名について信頼されている必要があります(キーチェーンアクセスの証明書ビューの信頼セクションの最後から3番目のyosemiteで)。

当初、証明書はキーチェーンへのコード署名で知られていませんでした。拡張目的の「コード署名」が欠落していたため、キーチェーンを調べて証明書をダブルクリックすると、これを見つけることができます。

ここに画像の説明を入力してください

私はそれを修正しました:

ここに画像の説明を入力してください

次に、証明書をキーチェーンからデスクトップにドラッグアンドドロップした後、信頼できる署名証明書に証明書を追加しました。これにより、〜/ Desktop/gdb-cert.cerが作成されました。

$ sudo security add-trusted-cert -d -r trustRoot -p codeSign -k /Library/Keychains/System.keychain ~/Desktop/gdb-cert.cer

私はいくつかのインターネット投稿に誤解され、マニュアルページを見ていなかったので、これは少しトリッキーでした。add-trust( https://llvm.org/svn/llvm-project/lldb/trunk/docs/code-signing.txt )を使用する必要があるとの意見もありました。ひどい点は、コマンドが成功したが、「すべき」ことを実行しなかったことです(まあ、それは間違ったコマンドでしたが、それは間違っていると私に言ったはずです)。

その後、次のような信頼できる証明書で新しい証明書を見つけました。

$ security find-identity -p codesigning

Policy: Code Signing
  Matching identities
      1) E7419032D4..... "Mac Developer: FirstName LastName (K2Q869SWUE)"    (CSSMERR_TP_CERT_EXPIRED)
      2) ACD43B6... "gdb-cert"
  2 identities found

  Valid identities only
      1) ACD43... "gdb-cert"
  1 valid identities found

私の場合、Apple certは期限切れですが、gdbに署名するために使用していたものは期限切れではありませんでした(まあ、私は自分で作成しただけです)。また、ポリシーの名前は、「security add-trusted-cert」(-pcodeSign)と「securityfind-identity」コマンド(-p codesigning)で異なることに注意してください。次に、gdbに署名しましたが、常に次のようになりました。

$ codesign --sign gdb-cert.cer --keychain ~/Library/Keychains/login.keychain `which gdb`
  gdb-cert.cer: no identity found

--signオプションに証明書ファイルのファイル名を指定する必要があるという印象を受けましたが、実際には、それが、提供する必要があり、トラストストアにあるはずの証明書のCNでした。キーチェーンの証明書をダブルクリックすると、ここでCNを見つけることができます。

ここに画像の説明を入力してください

または、上記の「securityfind-identity-pcodesigning」の出力。それから私は署名を続け、それに正しいキーホルダーを与えなければなりませんでした:

 codesign -s gdb-cert --keychain /Library/Keychains/System.keychain `which gdb` 

キーチェーンへのアクセスを許可するには、rootパスワードを入力する必要がありました。

それは私に動作するgdbを与え、それはあなたに署名されたアプリケーションを与えるはずです。

于 2015-09-03T15:39:36.433 に答える
4

実行可能ファイルに署名する必要があるようです。詳細については、これらのリンクを参照してください。そのバージョンのを再配布する予定がない場合は、自己署名を回避できるはずですgdb

https://developer.apple.com/library/mac/#documentation/Security/Conceptual/CodeSigningGuide/Introduction/Introduction.html

https://developer.apple.com/library/mac/#documentation/Darwin/Reference/Manpages/man1/codesign.1.html

または、システムでコード署名を無効にすることもできますが、これにはセキュリティ上のリスクがあります。これを行うsudo spctl --master-disableには、ターミナルで実行してみてください。

于 2012-12-17T12:29:29.360 に答える
4

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

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

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

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

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

  4. gdbを使用する

于 2013-11-18T12:54:05.133 に答える
4

使用gdbが難しい要件ではない場合はlldb、代わりに使用することもできます。それはすでにシステム上にあり、コード署名する必要はありません:

$ lldb stddev_bugged
(lldb) target create "stddev_bugged"
Current executable set to 'stddev_bugged' (x86_64).
(lldb) b mean_and_var
Breakpoint 1: where = stddev_bugged`mean_and_var + 17 at stddev_bugged.c:17, address = 0x0000000100000b11
(lldb) r
Process 1621 launched: '/Users/richardschneeman/Documents/projects/21stCentury/02/example-00/stddev_bugged' (x86_64)
Process 1621 stopped
* thread #1: tid = 0xc777, 0x0000000100000b11 stddev_bugged`mean_and_var(data=0x00007fff5fbff590) + 17 at stddev_bugged.c:17, queue = 'com.apple.main-thread', stop reason = breakpoint 1.1
    frame #0: 0x0000000100000b11 stddev_bugged`mean_and_var(data=0x00007fff5fbff590) + 17 at stddev_bugged.c:17
   14   typedef struct meanvar {double mean, var;} meanvar;
   15
   16   meanvar mean_and_var(const double *data){
-> 17       long double avg = 0,
   18             avg2 = 0;
   19       long double ratio;
   20       size_t count= 0;
(lldb)

これがコマンドに変換する表gdbですhttp://lldb.llvm.org/lldb-gdb.htmllldb

于 2015-11-19T23:16:16.057 に答える
3

私は他の人が提案した指示ではなく、これらの指示に従う必要がありました。

killall taskgated違いを生んだのがrootユーザーを有効にする行為なのかプロセスなのかはまだわかりません。

再起動が必要だという人もいます。上記の手順では、そうではない可能性があります。

@ klm123が推奨する変更も行ったので、これも貢献した可能性があります。

私はmacportsではなく自作を使用していることに注意してください。

于 2014-03-12T18:39:29.667 に答える
3

これは古い質問ですが、どの解決策もうまくいかなかったようです(私はMojaveを使用していました)。lldbに変換することは、問題の解決策ではありません。それは単なる回避策です。

いくつかの解決策を試した後、私がうまくいくことがわかったのはここにありました:https ://gist.github.com/gravitylow/fb595186ce6068537a6e9da6d8b5b96d#gistcomment-2891198

このサイトを参照するもの:https ://sourceware.org/gdb/wiki/PermissionsDarwin#Sign_and_entitle_the_gdb_binary

このソリューションには、コード署名のわずかに変更されたバージョンが含まれます。基本的に、主な違いは、証明書に署名するときに、コード署名時に資格XMLファイルを渡す必要があることです。以下では、最初から最後までのすべてのステップについて、ソースウェアWebサイトのコンテンツをコピーして貼り付けました。

1.1。システムキーチェーンに証明書を作成します

キーチェーンアクセスアプリケーションを起動します(/ Applications / Utilities / Keychain Access.app)

メニュー項目/キーチェーンアクセス/証明書アシスタント/証明書の作成...を開きます。

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

証明書をシステムキーチェーンに保存できない場合は、代わりにログインキーチェーンに証明書を作成してからエクスポートします。次に、それをシステムキーチェーンにインポートできます。

最後に、キーチェーンアクセスアプリケーションを終了して、証明書ストアを更新します。

コントロール:ターミナルタイプで

security find-certificate -c gdb-cert

これにより、新しく作成された証明書に関する詳細が表示されます。

キーチェーン: "/ Library / Keychains / System.keychain"バージョン:256クラス:0x80001000属性: "alis" = "gdb-cert" [...]

示されているように、keychain:がシステムキーチェーンであることを確認してください。

また、証明書の有効期限がまだ切れていないことを確認してください。

security find-certificate -p -c gdb-cert | openssl x509 -checkend 0

X509データ構造全体を検査する場合は、次のように入力できます。

security find-certificate -p -c gdb-cert |openssl x509 -noout -text

1.2。コード署名用の証明書を信頼する

キーチェーンアクセスを再開します。証明書のコンテキストメニューを使用して、[情報を見る]を選択し、[信頼]アイテムを開き、[コード署名]を[常に信頼する]に設定します。

最後に、キーチェーンアクセスアプリケーションをもう一度終了して、証明書ストアを更新します。

コントロール:ターミナルタイプで

security dump-trust-settings -d

これにより、gdb-cert証明書(おそらくとりわけ)と、コード署名を含むその信頼設定が表示されます。

1.3。gdbバイナリに署名して資格を与える

(Mac OS X 10.14以降)以下を含むgdb-entitlement.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.debugger</key>
    <true/>
</dict>
</plist>

前のセクションで生成した証明書がgdb-certとして知られている場合は、次を使用します。

codesign --entitlements gdb-entitlement.xml -fs gdb-cert $(which gdb)

またはMojave(10.14)の前、ちょうど

codesign -fs gdb-cert $(which gdb)

gdbバイナリが通常のユーザーが書き込みできない場所にある場合は、このコマンドの前にsudoを付ける必要がある場合があります。

gdbを頻繁にビルドする場合は、-enable-codesign = gdb-cert(gdb-certが証明書の名前であると想定)を渡して構成することで、この手順を自動化できます。

コントロール:ターミナルタイプで

codesign -vv $(which gdb)

また、10.14(Mojave)以降については、資格も確認してください。

codesign -d --entitlements - $(which gdb)

1.4。システムの証明書とコード署名データを更新します

最も信頼できる方法は、システムを再起動することです。

より侵襲性の低い方法は、現在実行中のtaskgatedプロセスを強制終了してtaskgatedサービスを再開することです(プロセスの任意の時点で、gdbを再度実行する前までに):

sudo killall taskgated

ただし、タスクゲートされたサービスは、強制終了後に正常に再起動しない場合があるため、たとえばps $(pgrep -f taskgated)をチェックして、このステップの後でサービスが有効であることを確認してください。または、上記のように、システムを再起動します。

于 2020-05-03T14:11:10.107 に答える
2

これは非常に古いトピックですが、利用可能な多くの命令のうち、自己署名デバッガーを機能させるための適切な手順が含まれているのは1つだけであるため、応答を追加しています。

自己署名ルート証明書を作成し、それを使用してgdb実行可能ファイルに署名する必要がありますが、多くの人がそれが機能しないと不満を漏らしました。私がこのリンクに出くわすまで、私もそれをしませんでした。

他のマニュアルに欠けている重要な点は、変更を有効にするためにコンピュータを再起動する必要があるということです。それをしたら、すべてが意図したとおりに機能しました。

これが他の人の役に立つことを願っています。

于 2013-05-30T21:13:08.690 に答える
0

コード署名の指示に従いましたが、gdbでも同じエラーが発生します。gdbをroot(sudo gdb)として実行すると機能することが判明しました。Sierraosxを使用しています。

于 2019-06-09T16:44:21.237 に答える
0

これが質問に対する直接の答えではないことは知っていますが、gdbを機能させるために取り組む前に、誰かがそれについて言及してくれたらいいのにと思います。

Xcodeと呼ばれるAppleの無料IDEを使用して、C++コードをビルドおよびデバッグできます。(Xcodeは「VisualStudio」または「AndroidStudio」に似ています。)私はすでにXcodeユーザーでしたが、オプションがかなり隠されているため、C++で動作することを知りませんでした。このyoutubeビデオはそれを通してあなたを案内します:

https://www.youtube.com/watch?v=-H_EyIqBNDA

于 2021-08-12T20:04:50.050 に答える