web-dev-qa-db-ja.com

OSXで「共同設計」されたgdbを取得する方法は?

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

brew tap homebrew/dupes
brew install gdb

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

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))

この文脈で「共同設計」とはどういう意味ですか?このgdbrunningを取得するにはどうすればよいですか?

41
clstaudt

実行可能ファイルに署名する必要があるようです。詳細については、これらのリンクを参照してください。 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ターミナルで。

4
Matt

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/Keychain Access.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

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

91
Zak

この方法でコード署名することなく、OSX 10.9でgdbを動作させました( here ):

  1. Macportsでgdbをインストールします。 (スキップすることもできます)

  2. Sudo nano /System/Library/LaunchDaemons/com.Apple.taskgated.plist

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

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

  4. Gdbを使用する

5
klm123

私は他の人が提案した指示の代わりに これらの指示 に従わなければならなくなりました。

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

再起動が必要だと言う人もいます。上記の指示では、そうではない場合があります。

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

MacPortではなく、Homebrewを使用していることに注意してください。

3
Doctor Mohawk

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

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

enter image description here

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

enter image description here

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

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

これは少しトリッキーでした。なぜなら、私はいくつかのインターネットの投稿に誤解されていて、manページを見ていないからです。 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」(-p codeSign)および「security find-identity」コマンド(-p codesigning)。その後、gdbに署名しましたが、常に次のようになりました。

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

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

enter image description here

または、上記の「security find-identity -p codesigning」の出力で。それから私は署名を続け、それに適切なキーチェーンを与えなければなりませんでした。

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

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

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

3
user637338

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

自己署名ルート証明書を作成し、それを使用してgdb実行可能ファイルに署名する必要がありますが、多くの人は、それが機能しないと苦情を言いました。 このリンク につまずくまで、私のためにそれをしませんでした。

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

これが他の人の助けになることを願っています。

3
skh

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コマンドをlldbコマンドに変換する表を示します http://lldb.llvm.org/lldb-gdb.html

2
Schneems

指示に従ってコード署名を行いましたが、gdbでも同じエラーが発生します。 gdbをルート(Sudo gdb)として実行すると動作することが判明しました。 Sierra osxを使用しています。

0
Ilya M