web-dev-qa-db-ja.com

アップグレード後、gdbはプロセスにアタッチしません

私は最近10.04から11.04にアップグレードしましたが、gdbでプロセスに接続できなくなり、エラーが発生します

プロセスにアタッチ10144プロセスにアタッチできませんでした。 uidがターゲットプロセスのuidと一致する場合は、/ proc/sys/kernel/yama/ptrace_scopeの設定を確認するか、rootユーザーとして再試行してください。詳細については、/ etc/sysctl.d/10-ptrace.conf ptrace:Operation not allowedを参照してください。

Sudoなしで再びデバッグできるようにするにはどうすればよいですか?

66
Andrew Redd

Maverick Meerkat(10.10)では、Ubuntuは非ルートユーザーによる非子プロセスの追跡を禁止するパッチを導入しました。別のプロセスの親であるプロセスのみが通常のユーザーのためにそれを追跡できますが、ルートはすべてのプロセスを追跡できます。したがって、なぜgdbを使用してまだSudo経由で接続できるのでしょう。

以下を実行することにより、この制限を一時的に無効にできます(そして、ユーザーが他のプロセスをptrace(gdb)できるようにする古い動作に戻すことができます)。

echo 0 | Sudo tee /proc/sys/kernel/yama/ptrace_scope

/etc/sysctl.d/10-ptrace.confの編集と行の変更を永続的に許可するには:

kernel.yama.ptrace_scope = 1

読むために

kernel.yama.ptrace_scope = 0

この変更が行われた背景については、 buntu wiki をご覧ください

105
alexmurray

/proc/sys/kernel/yama/ptrace_scopeをデフォルト値1に設定したままにする場合は、回避策として、gdbを使用してデバッグするプログラムを実行することを検討できます。 ^Cを押すだけでデバッガを起動できます。たとえば、(退屈な)プログラムsleep 60をデバッグするには、次の手順を実行します。

$ gdb -q sleep -ex 'run 60'

完全な例を次に示します。

$ gdb -q sleep -ex 'run 60'
Reading symbols from sleep...(no debugging symbols found)...done.
Starting program: /bin/sleep 60
^C
Program received signal SIGINT, Interrupt.
0x00007ffff7ad5d60 in __nanosleep_nocancel () at ../sysdeps/unix/syscall-template.S:81
81      ../sysdeps/unix/syscall-template.S: No such file or directory.
(gdb) backtrace
#0  0x00007ffff7ad5d60 in __nanosleep_nocancel () at ../sysdeps/unix/syscall-template.S:81
#1  0x0000000000403cd7 in ?? ()
#2  0x0000000000403b88 in ?? ()
#3  0x00000000004016c9 in ?? ()
#4  0x00007ffff7a35ec5 in __libc_start_main (main=0x401540, argc=2, argv=0x7fffffffea08, init=<optimized out>, 
    fini=<optimized out>, rtld_fini=<optimized out>, stack_end=0x7fffffffe9f8) at libc-start.c:287
#5  0x00000000004017d5 in ?? ()
(gdb) continue
Continuing.
[Inferior 1 (process 3531) exited normally]
(gdb) quit

/bin/sleepは(当然のことながら)デバッグ情報なしでコンパイルされたため、上記のバックトレースには最小限の情報が含まれています。

3
mpb