Linuxでは、GDBを使用して現在実行中のプロセスをデバッグできますか?
Linuxでは、GDBを使用して現在実行中のプロセスをデバッグできますか?
回答:
はい。attach
コマンドを使用します。詳細については、このリンクを確認してください。help attach
GDBコンソールで入力すると、次のようになります。
(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.
echo 0 | sudo tee /proc/sys/kernel/yama/ptrace_scope
。
で実行中のプロセスにアタッチできますgdb -p PID
。
はい。できるよ:
gdb program_name program_pid
ショートカットは次のようになります(1つのインスタンスのみが実行されている場合):
gdb program_name `pidof program_name`
program_name
バイナリと同じディレクトリにいる場合に動作することに注意してください。別のディレクトリにいる場合は、バイナリへのパスが機能すると思います。
-p
目の前を忘れていませんprogram_id
か?また、実行中のプロセスにアタッチするには、sudoを使用してgdbを実行する必要がある場合があります。
はい、できます。プロセスfoo
が実行されていると仮定します...
ps -elf | grep foo PID番号を探す gdb -a {PID番号}
プロセスをアタッチしたい場合、このプロセスは同じ所有者でなければなりません。ルートはどのプロセスにもアタッチできます。