私はgdbでプログラムを添付しようとしていますが、それは返されます:
プロセスへの接続29139
プロセスにアタッチできませんでした。 uidがターゲットプロセスのuidと一致する場合は、/ proc/sys/kernel/yama/ptrace_scopeの設定を確認するか、rootユーザーとして再試行してください。詳細については、/ etc/sysctl.d/10-ptrace.confを参照してください
ptrace:操作は許可されていません。
gdb-debuggerは「プロセスへのアタッチに失敗しました。権限を確認して、もう一度試してください」を返します。
straceは「attach:ptrace(PTRACE_ATTACH、...):操作は許可されていません」を返します
「kernel.yama.ptrace_scope」1を0に変更し、/proc/sys/kernel/yama/ptrace_scope
1から0まで、そしてset environment LD_PRELOAD=./ptrace.so
これとともに:
#include <stdio.h>
int ptrace(int i, int j, int k, int l) {
printf(" ptrace(%i, %i, %i, %i), returning -1\n", i, j, k, l);
return 0;
}
しかし、それでも同じエラーが返されます。デバッガーにアタッチするにはどうすればよいですか?
Dockerを使用している場合、おそらく次のオプションが必要になります。
docker run --cap-add=SYS_PTRACE --security-opt seccomp=unconfined
これは、Linuxのカーネル強化によるものです。 echo 0 > /proc/sys/kernel/yama/ptrace_scope
または/etc/sysctl.d/10-ptrace.conf
で変更することで、この動作を無効にできます
Fedora 22のこの記事 (ドキュメントへのリンク付き)および buntuについてのこのコメントスレッド およびも参照してください。
必要なことを追加したい--security-opt apparmor=unconfined
と@wisbuckyが言及したオプション。これはUbuntu 18.04(Dockerクライアントとホストの両方)にありました。したがって、コンテナ内でgdbデバッグを有効にするための完全な呼び出しは次のとおりです。
docker run --cap-add=SYS_PTRACE --security-opt seccomp=unconfined --security-opt apparmor=unconfined
実際には上記のユースケースに対応していませんが、この問題がありました:
問題:Sudo
でプログラムを開始したため、gdbを起動するとptrace: Operation not permitted
。
ソリューション:Sudo gdb ...
誰かがこのプロセスをgdbでアタッチしているのかもしれません。
同じプロセスを2回アタッチすることはできません。
ジェサップの答えは正しいです。これは、Linuxカーネルの強化によるものです。私の場合、Mac用Dockerコミュニティを使用しており、フラグを変更するには、ジャスティンコルマックのnsenterを使用してLinuxKitシェルに入る必要があります(参照: https://www.bretfisher.com/docker-for -mac-commands-for-getting-into-local-docker-vm / )。
docker run -it --rm --privileged --pid=Host justincormack/nsenter1
/#cat/etc/issue
LinuxKitへようこそ
## . ## ## ## == ## ## ## ## ## === /"""""""""""""""""\___/ === { / ===- \______ O __/ \ \ __/ \____\_______/
/#cat/proc/sys/kernel/yama/ptrace_scope
1
/#echo 0>/proc/sys/kernel/yama/ptrace_scope
/ # 出口
LD_PRELOADまたはptrace関数で何をしているのかわかりません。
Gdbを非常に単純なプログラムに添付してみませんか? Helloまたは何かを繰り返し出力するプログラムを作成し、gdb --pid [hello program PID]を使用してアタッチします。
それでもうまくいかない場合は、本当に問題があります。
別の問題はユーザーIDです。トレースしているプログラム自体が別のUIDに設定されていますか?その場合、同じユーザーIDを使用しているか、rootでない限り、ptraceを実行できません。
私は同じ問題に直面し、多くの解決策を試みましたが、最終的には解決策を見つけましたが、実際には問題が何であるかわかりません。最初にptrace_confの値を変更し、Ubuntuにルートとしてログインしましたが、問題は引き続き発生します。しかし、起こった最も奇妙なことは、gdbが私に言うメッセージを見せてくれたことです:
Could not attach to process. If your uid matches the uid of the target process, check the setting of /proc/sys/kernel/yama/ptrace_scope, or try again as the root user.
For more details, see /etc/sysctl.d/10-ptrace.conf warning: process 3767 is already traced by process 3755 ptrace: Operation not permitted.
Psコマンド端末では、プロセス3755はリストされませんでした。
/ proc/$ pidでプロセス3755を見つけましたが、それが何であるかわかりません!!
最後に、PTRACE_ATTACH syscallを使用してgdbおよびトレーサーcプログラムに添付しようとするターゲットファイル(foo.c)を削除し、別のフォルダーに別のcプログラムを作成してコンパイルしました。
問題は解決され、gdbまたはptrace_attach syscallによって別のプロセスにアタッチできるようになりました。
(gdb) attach 4416
Attaching to process 4416
そして、プロセス4416に多くのシグナルを送信します。gdbとptraceの両方でテストしました。両方とも正しく実行されます。
本当に何が問題なのかわかりませんが、多くのサイトがそれを参照しているので、Ubuntuのバグではないと思います https://askubuntu.com/questions/143561/why- wont-strace-gdb-attach-to-a-process-even-though-im-root