1. ホーム
  2. linux

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

2022-07-11 07:10:03

質問

linux では、現在実行中のプロセスをデバッグするために GDB を使用することができますか?

どのように解決するのですか?

はい。 この場合 attach コマンドを使用します。 チェックアウト このリンク をご覧ください。 タイピング help attach をGDBコンソールで入力すると、次のようになります。

(gdb) help attach

GDB外のプロセスやファイルにアタッチする。 このコマンドは、最後にアタッチしたものと同じタイプの別のターゲットにアタッチします。 と同じタイプの別のターゲットにアタッチします。 target コマンド(" info files "はターゲットスタックを表示します)。 このコマンドは、プロセス ID、プロセス名 (サフィックスとしてオプションの process-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.