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


67

私は最近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なしで再びデバッグできるように、これを修正するにはどうすればよいですか?

回答:


107

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

以下を実行することにより、この制限を一時的に無効にできます(そして、ユーザーが他のプロセスを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

この変更が行われた理由の背景については、Ubuntu wikiを参照してください。


4
ありがとう。一時ファイルをユーザーbinファイルのコマンドに追加したので、オンとオフを切り替えることができます。
アンドリューレッド

/etc/sysctl.d/10-ptrace.confファイルを編集します。それは私にとって完璧に機能します。:)
soroosh

8
/etc/sysctl.d内のファイルを編集した場合、「sudo service procps restart」でフランクスターを自動的に適用できます
フランクスター

@alexmurray-また、変更を/etc/sysctl.d有効にするには何らかの再起動が必要であることに注意してください。私にとっては、システムの再起動で十分でしたが、やり過ぎかもしれません-上記のフランクスターのコメントを参照してください。再起動後、からの値/etc/sysctl.dがにコピーされ/proc/sys/kernel/yama/ptrace_scopeます。(また、私の場合、sudoを使用してもptrace_scopeを直接編集できませんでした。)
Andy Thomas

再起動は必要ありません。:ちょうど実行sysctl -pからの変更を適用する/etc/sysctl.conf/etc/sysctl.d/*。この特定の変更については、鮮やかなUbuntuの15.04で、ファイルがある/etc/sysctl.d/10-ptrace.conf
ミルチャVutcovici

3

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


2
あなたは添付しなかった、あなたそれを始めた。この場合gdb、デバッグ対象の直接の親であり、でもデバッグするすべての権利があるため、まったく異なりptrace_scope==1ます。それはあなたが代わり場合は動作しません添付、すなわちのようなものでしたsleep 60& gdb -ex "attach $!"
ルスラン

Ruslanが提案した(カウンター?)例sleep 60& gdb -ex "attach $!"は、「gdbを使用してプログラムを実行する」ものではないため、私の仕事の反論ではありません。Ruslanの例では、シェルを使用て最初に実行しsleep、次に実行しgdbます。私の回避策は機能しますが、それは私が気にしていることです。gdb実際にその子供に愛着を抱いているかどうかは知りませんし、本当に気にしません。私は子供をデバッグできることに関心があります。私の回避策はそれを達成します。それにもかかわらず、明確にするために答えを言い換えました。
mpb
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.