GDBを使用して実行中のプロセスをデバッグできますか?


回答:


88

はい。attachコマンドを使用します。詳細については、このリンクを確認してください。help attachGDBコンソールで入力すると、次のようになります。

(gdb) help attach

GDB外のプロセスまたはファイルにアタッチします。このコマンドは、最後の「target」コマンドと同じタイプの別のターゲットに接続します(「info files」はターゲットスタックを表示します)。このコマンドは、プロセスID、プロセス名(オプションのプロセスIDをサフィックスとして使用)、またはデバイスファイルを引数として取ります。プロセスIDの場合、プロセスにシグナルを送信する権限が必要であり、デバッガーと同じ有効なuidが必要です。attach既存のプロセスに" "を使用すると、デバッガーはプロセスで実行中のプログラムを見つけ、最初に現在の作業ディレクトリを検索するか、(そこに見つからない場合は)ソースファイルの検索パスを使用します( " directory"コマンドを参照)。" file"コマンドを使用してプログラムを指定し、そのシンボルテーブルをロードすることもできます。


注:Linuxカーネルのセキュリティが向上しているため、プロセスにアタッチするのが困難な場合があります。たとえば、あるシェルの子から別のシェルの子にアタッチする場合などです。

/proc/sys/kernel/yama/ptrace_scope要件に応じて設定する必要があるでしょう。多くのシステムは現在デフォルト1以上になっています。

The sysctl settings (writable only with CAP_SYS_PTRACE) are:

0 - classic ptrace permissions: a process can PTRACE_ATTACH to any other
    process running under the same uid, as long as it is dumpable (i.e.
    did not transition uids, start privileged, or have called
    prctl(PR_SET_DUMPABLE...) already). Similarly, PTRACE_TRACEME is
    unchanged.

1 - restricted ptrace: a process must have a predefined relationship
    with the inferior it wants to call PTRACE_ATTACH on. By default,
    this relationship is that of only its descendants when the above
    classic criteria is also met. To change the relationship, an
    inferior can call prctl(PR_SET_PTRACER, debugger, ...) to declare
    an allowed debugger PID to call PTRACE_ATTACH on the inferior.
    Using PTRACE_TRACEME is unchanged.

2 - admin-only attach: only processes with CAP_SYS_PTRACE may use ptrace
    with PTRACE_ATTACH, or through children calling PTRACE_TRACEME.

3 - no attach: no processes may use ptrace with PTRACE_ATTACH nor via
    PTRACE_TRACEME. Once set, this sysctl value cannot be changed.

8
リンクが壊れています:(私の観点から、私はJ. Polfer。Cheersからのこれと同じように答えが好きです;)
olibre

リンクを修正しました。
Attie

これはリモートターゲット上のプロセスのPIDでも機能しますか?
Bionix1441 2018年

次に、リモートターゲットでデバッグサーバーを実行する必要があります。その後は同じになるはずです。
カールノルム2018年

フラグはを使用して変更できますecho 0 | sudo tee /proc/sys/kernel/yama/ptrace_scope
荒巻大輔


24

はい。できるよ:

gdb program_name program_pid

ショートカットは次のようになります(1つのインスタンスのみが実行されている場合):

gdb program_name `pidof program_name`

それが何をするのかはわかりませんが、地獄は私には効かないので確かです。<program_pid>が存在しないことを示しています。
フクロウ

2
これは、プロセスにアタッチするだけでなく、シンボルテーブルをロードするときに最も効果的に機能します。program_nameバイナリと同じディレクトリにいる場合に動作することに注意してください。別のディレクトリにいる場合は、バイナリへのパスが機能すると思います。
KarateSnowMachine 2016年

-p目の前を忘れていませんprogram_idか?また、実行中のプロセスにアタッチするには、sudoを使用してgdbを実行する必要がある場合があります。
mxmlnkn


3

はい、できます。プロセスfooが実行されていると仮定します...

ps -elf | grep foo

PID番号を探す

gdb -a {PID番号}

5
どのディストリビューションで実行していますか?Fedoraの最近のバージョンを使用すると、「gdb -a」は「オプション-aがあいまいです」エラーを出力します。
ジャスティンエティエ2010

1
公式の議論は-p /
-pid

3

プロセスをアタッチしたい場合、このプロセスは同じ所有者でなければなりません。ルートはどのプロセスにもアタッチできます。


2

ps -elfがPIDを表示していないようです。代わりに使用することをお勧めします:

ps -ld | grep foo
gdb -p PID

2

最も簡単な方法は、プロセスIDを提供することです。

gdb -p `pidof your_running_program_name`

man gdbコマンドのオプションの完全なリストを取得してください。

実行中の同じプログラムに複数のプロセスがある場合、次のコマンドはプロセスを一覧表示します。

ps -C program -o pid h
<number>

次に、出力プロセスID(番号)をgdbの引数として使用できます。

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