web-dev-qa-db-ja.com

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

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

102
Justin Ethier

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

(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.
81
Carl Norum

gdb -p PIDを使用して、実行中のプロセスにアタッチできます。

101

はい。できるよ:

gdb program_name program_pid

ショートカットは次のとおりです(1つのインスタンスのみが実行されていると仮定):

gdb program_name `pidof program_name`
22
J. Polfer

使用するコマンドはgdb attach pidです。ここで、pidは接続するプロセスのプロセスIDです。

14
David Kanarek

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

 ps -elf | grep foo 
 
 PID番号を探します
 
 gdb -a {PID番号} 
3
t0mm13b

プロセスをアタッチする場合、このプロセスには同じ所有者が必要です。ルートは任意のプロセスにアタッチできます。

3
Milan Kerslager

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

ps -ld | grep foo
gdb -p PID
2
Nino Pereira