gdbが「プロセスIDのMachタスクポートが見つかりません」エラーで失敗する


138

アプリは正常に実行されますが、gdbは次のエラーでデバッグに失敗します

(gdb) run
Starting program: /path/to/app 
Unable to find Mach task port for process-id 83767: (os/kern) failure (0x5).

私はOS X Lionを使用しています。GDBバージョンは

$ gdb --version
GNU gdb 6.3.50-20050815 (Apple version gdb-1752) (Sat Jan 28 03:02:46 UTC 2012)
Copyright 2004 Free Software Foundation, Inc.
GDB is free software, covered by the GNU General Public License, and you are
welcome to change it and/or distribute copies of it under certain conditions.
Type "show copying" to see the conditions.
There is absolutely no warranty for GDB.  Type "show warranty" for details.
This GDB was configured as "x86_64-apple-darwin".

この投稿が役立つと思います:stackoverflow.com/questions/10221448/…
Codie CodeMonkey 2012

回答:


64

Snow Leopard以降のMac OSバージョンでは、gdb実行可能ファイルにコード署名するだけでは不十分です。

これを機能させるには、このガイドに従う必要があります。http//www.opensource.apple.com/source/lldb/lldb-69/docs/code-signing.txt

このガイドでは、その方法を説明していますlldbが、プロセスはでもまったく同じですgdb


12
これらの命令は、MacPortsのとOSX 10.9.2上の私のために動作しませんでしたが、これはやった:sourceware.org/gdb/wiki/BuildingOnDarwin
simpleuser

できます!しかし、sudo security add-trustラインが何をしているか説明していただけませんか?.cer今すぐデスクトップからファイルを削除できますか?
Sreejith Ramakrishnan

9
codesign -s gdb_codesign `which gdb` このガイドの後に役立ちます
synther

またはsudo codesign -s gdb_codesign `which gdb-apple` macOSシエラ上。
16

3
最新のOSの場合、リンク は機能しました
yuxuan '18

144

に変更すると機能しsudo gdb executableFileNameます!:)


2
ありがとう。このプラスのコード署名は、gdbを機能させるために必要でした。私はgdbにルートアクセスを付与し(ここでstackoverflow.com/questions/10476154/…に説明されているように)、毎回sudoを入力する必要がありませんでした。編集-ここでより良いアプローチを見つけました:stackoverflow.com/a/10441587/305149
Aneil Mallavarapu

14
ルートとして実行しますか?真剣ですか?最悪の「解決策」。
エクイダモイド

7
@Equidamoid gdbrootとして実行するのはなぜそんなに悪いのでしょうか?ただのデバッガなので気になりました。
このユーザーは2016

ルートとして実行するとどうなりますか?それはあなたが書いたコードであり、私は結果を理解していません
COLD ICE

4
@COLDICE一般に、プロセスをシステムの変更や1024未満のポートを開くためにアクセスする必要がないため、昇格された特権(特にrootとして上に昇格)でプロセスを実行したくない非システム/非rootユーザーが使用)。自分のコードを「信頼」しても、それが原因の間違いrm -rf /や、コンピュータが起動して正常に動作するために依存しているいくつかの構成/バイナリを上書きする、同様に破壊的な何かをしなかったわけではありません。
shaunhusain

32

証明書を作成してgdbに署名する必要があります。

  • アプリケーション「キーチェーンアクセス」を開きます(/アプリケーション/ユーティリティ/キーチェーンアクセス.app)
  • メニューを開く/ Keychain Access / Certificate Assistant / Create a Certificate ...
  • 名前(例ではgdb-cert)を選択し、[IDの種類]を[自己署名ルート]に設定し、[証明書の種類]を[コード署名]に設定して、[デフォルトを上書きする]を選択します。「続行」をクリックします。事前定義の365日の期間を3650日に延長することができます。
  • 「証明書の場所を指定」画面が表示されるまで「続行」を数回クリックし、「キーチェーンをシステムに」を設定します。
  • 証明書を「システム」キーチェーンに保存できない場合は、「ログイン」キーチェーンで作成してからエクスポートします。次に、それを「システム」キーチェーンにインポートできます。
  • キーチェーンで「システム」を選択すると、新しい証明書が見つかります。証明書のコンテキストメニューを使用して、[情報を見る]を選択し、[信頼]を開いて、[コード署名]を[常に信頼する]に設定します。
  • 証明書を使用し、現在実行中の「taskgated」プロセスを強制終了して「taskgated」サービスを再起動するには、「Keychain Access」アプリケーションを終了する必要があります。または、コンピュータを再起動することもできます。
  • 最後に、gdbに署名できます。

    sudo codesign -s gdb-cert /usr/local/bin/ggdb

    sudo ggdb ./myprog


4
taskgatedを強制終了してもプロセスは再開されませんでした。必要なもの:sudo launchctl load /System/Library/LaunchDaemons/com.apple.taskgated.plist
Ben

上記はタスクゲーティングを再開しました-残念ながら、シエラでの再起動なしではまだ機能しませんでした。
ニール・マギル

16

問題は、rootユーザーとしてログインしていないことです(これは望ましくありません)。アクセスを許可するには、gdbの証明書を作成する必要があります。このチュートリアルに従ってください。そうすれば、問題はありません...

http://sourceware.org/gdb/wiki/BuildingOnDarwin

他のすべてが失敗した場合は、単に次を使用します sudo gdb executableFileName


4
ここに組み込まれているチュートリアルが最も効果的でした。アプリにcodesign -s gdb-cert $(which gdb)署名するために実行する必要がありましたgdb
cevaris 2015年

OSX 10.12.5でこれを試す人のために確認するだけで、BuildingOnDarwinリンクで説明されている手順を実行し、rootユーザーに切り替えた後にgdbを実行する必要があります。
AdjunctProfessorFalcon 2017

7

このリンクには、このエラーを表示しないようにするための最も明確で詳細な手順が記載されていました。

私の場合、「システム」キーとしてキーを持たなければなりませんでした。

また、強制終了taskgatedは、再起動しなければならない代わりに実行可能な(そしてより速い)代替手段です。

このプロセスを開始する前にMacPortsアンインストールし、を使用して現在のgdbをアンインストールしましたbrew uninstall gdb


これでうまくいきました。を使用する参照用の+1 brew
トリゴマン2014

3

El Capitanで動作させるには、次のコマンドが必要です。

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


2

MacOSXでは、lldbにコード署名する必要があります。デバッグビルドとリリースビルドは、lldb_codesignという名前のコード署名証明書を使用してコード署名するように設定されています。

If you don't have one yet you will need to:
- Launch /Applications/Utilities/Keychain Access.app

- In Keychain Access select the "login" keychain in the "Keychains"
  list in the upper left hand corner of the window.

- Select the following menu item:

    Keychain Access->Certificate Assistant->Create a Certificate...

- Set the following settings

    Name = lldb_codesign
    Identity Type = Self Signed Root
    Certificate Type = Code Signing

- Click Continue
- Click Continue
- Click Done
- Click on the "My Certificates"
- Double click on your new lldb_codesign certificate
- Turn down the "Trust" disclosure triangle

    Change:
        When using this certificate: Always Trust

- Enter your login password to confirm and make it trusted

The next steps are necessary on SnowLeopard, but are probably because of a bug
how Keychain Access makes certificates.

- Option-drag the new lldb_codesign certificate from the login keychain to
  the System keychain in the Keychains pane of the main Keychain Access window
  to make a copy of this certificate in the System keychain.  You'll have to
  authorize a few more times, set it to be "Always trusted" when asked.
- Switch to the System keychain, and drag the copy of lldb_codesign you just
  made there onto the desktop.
- Switch to Terminal, and run the following:

sudo security add-trust -d -r trustRoot -p basic -p codeSign -k /Library/Keychains/System.keychain ~/Desktop/lldb_codesign.cer

- Right click on the "lldb_codesign" certificate in the "System" keychain (NOT
  "login", but the one in "System"), and select "Delete" to delete it from
  the "System" keychain.
- Reboot
- Clean and rebuild lldb and you should be able to debug.

That should do it.

[注:-lldbはMacではgdbとして使用されます。]


2

これは私の問題を解決した本当に便利なガイドです(OSX 10.13.6)。

  1. キーチェーンアクセスを開く
  2. メニューで、[キーチェーンアクセス]> [証明書アシスタント]> [証明書の作成]を開きます
  3. 名前を付けます(例:gdbc)
    • IDタイプ:自己署名ルート
    • 証明書タイプ:コード署名
    • チェック:デフォルトを上書きする
  4. 「次の場所を指定してください...」というプロンプトが表示されるまで続行します。
  5. キーチェーンの場所をシステムに設定
  6. 証明書を作成し、アシスタントを閉じます。
  7. システムキーチェーンで証明書を見つけ、右クリックして>情報を取得します(または単にダブルクリックします)。
  8. 信頼を展開し、コード署名を常に信頼するように設定します
  9. 端末でtaskgatedを再起動します:killall taskgated
  10. codesign -fs gdbc /usr/local/bin/gdb端末で実行:これはrootパスワードを要求します

1

これらの手順はOSX High Sierraで機能し、ルートとしてgdbを実行することを避けます(うん!)。最近、OSX 10.13.2から10.3.3にアップデートしました。これは、gdb 8.0.1(homebrewと一緒にインストールされた)が失敗し始めたときだと思います。

他人の指示に苦労しました。別の指示の後、すべてが混乱しました。だから私は新たに始めました。私は多かれ少なかれこれらの指示に従いました。

混乱をきれいにする:

  1. brew uninstall --force gdb # This deletes _all_ versions of gdb on the machine
  2. Applications- > Utilities- > Keychain Access、私は(あなたはあなたがここでやっているか知っていること!)以前のすべてのgdbの証明書とキーを削除しました。これが必要かどうかは不明ですが、他の指示を使用してこれらの証明書とキーを作成しようと悩んだので、とにかくそれらを排除しました。ログインとシステムの両方にキーと証明書がありました。

ここでgdbを再インストールします。

  1. brew install gdb
  2. 内でKeychain Access、メニューに移動しますKeychain Access-> Certificate Assistant->Create a Certificate
  3. 「デフォルトを上書きさせます」をチェックして設定します
Name : gdb-cert
Identity Type: Self Signed Root
Certificate Type : Code Signing

[X] Let me override defaults
  1. 最初の証明書情報ページ:
Serial Number : 1
Validity Period (days): 3650
  1. 2番目の証明書情報ページで、すでに入力されているフィールドを除いて、すべてのフィールドを空白のままにしました。

  2. [キーペア情報]ページで、デフォルトのままにしました

Key Size : 2048
Algorithm : RSA
  1. [Key Usage Extension]ページで、デフォルトをチェックしたままにしました。
[X] Include Key Usage Extension
[X] This extension is critical
Capabilities:
[X] Signature
  1. 「拡張キー使用法拡張」ページで、デフォルトをチェックしたままにしました。
[X] Include Extended Key Usage Extension
[X] This extension is critical
Capabilities:
[X] Code Signing
  1. 基本制約拡張ページで、何もチェックされていませんでした(デフォルト)。

  2. [件名の代替名の拡張子]ページで、デフォルトをオンのままにし、他には何も追加しませんでした。

[X] Include Subject Alternate Name Extension
  1. [証明書の場所を指定してください]ページで、
Keychain: System
  1. [作成]をクリックすると、パスワードの入力を求められました。

  2. Keychain Accessアプリに戻り、System右クリックしgdb-certてドロップダウンメニューの下のTrustすべてのフィールドをに変更しましたAlways Trust

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

  4. ターミナルで、私は走りましたcodesign -s gdb-cert /usr/local/bin/gdb。プロンプトが表示されたらパスワードを入力しました。

  5. ターミナルで走った echo "set startup-with-shell off" >> ~/.gdbinit

  6. 私はgdbコンソール内で実行gdb myprogramstartました。ここでは、パスワードの入力を求められたと思います。その後、以降のすべての実行では、パスワードの入力を求められませんでした。


悲しいことに、私はトップ投票の回答とあなたの回答の両方を行いましたが、それでも同じエラーメッセージが表示されます。macOS Catalinaバージョン10.15.4とgdb 9.1を持っています。
ジェイサリバン

@JaySullivan +1。私も同じ問題を抱えています。
irsis

1

これは奇妙なアプローチですが、私(MacOs HighSierra 10.13.3)にはうまくいきました。CLionをインストールします。gdbが付属しています。ターミナルを使用してgdbを実行したら、gdbプログラムをusr / local / bin /にコピーします。サインイン、sudoなどの問題はありません。


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