web-dev-qa-db-ja.com

GDBをプロセスにアタッチしようとしたときに「ptrace operation not allowed」を解決する方法は?

私は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;
}

しかし、それでも同じエラーが返されます。デバッガーにアタッチするにはどうすればよいですか?

52
user2850750

Dockerを使用している場合、おそらく次のオプションが必要になります。

docker run --cap-add=SYS_PTRACE --security-opt seccomp=unconfined
120
wisbucky

これは、Linuxのカーネル強化によるものです。 echo 0 > /proc/sys/kernel/yama/ptrace_scopeまたは/etc/sysctl.d/10-ptrace.confで変更することで、この動作を無効にできます

Fedora 22のこの記事 (ドキュメントへのリンク付き)および buntuについてのこのコメントスレッド およびも参照してください。

36
jesup

必要なことを追加したい--security-opt apparmor=unconfinedと@wisbuckyが言及したオプション。これはUbuntu 18.04(Dockerクライアントとホストの両方)にありました。したがって、コンテナ内でgdbデバッグを有効にするための完全な呼び出しは次のとおりです。

docker run --cap-add=SYS_PTRACE --security-opt seccomp=unconfined --security-opt apparmor=unconfined

10
Juraj Oršulić

実際には上記のユースケースに対応していませんが、この問題がありました:

問題Sudoでプログラムを開始したため、gdbを起動するとptrace: Operation not permitted

ソリューションSudo gdb ...

7
Maxim Chetrusca

誰かがこのプロセスをgdbでアタッチしているのかもしれません。

  • ps -ef | grep gdb

同じプロセスを2回アタッチすることはできません。

2
Raymond

ジェサップの答えは正しいです。これは、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

/ # 出口

1
YudhiWidyatama

LD_PRELOADまたはptrace関数で何をしているのかわかりません。

Gdbを非常に単純なプログラムに添付してみませんか? Helloまたは何かを繰り返し出力するプログラムを作成し、gdb --pid [hello program PID]を使用してアタッチします。

それでもうまくいかない場合は、本当に問題があります。

別の問題はユーザーIDです。トレースしているプログラム自体が別のUIDに設定されていますか?その場合、同じユーザーIDを使用しているか、rootでない限り、ptraceを実行できません。

0
Zan Lynx

私は同じ問題に直面し、多くの解決策を試みましたが、最終的には解決策を見つけましたが、実際には問題が何であるかわかりません。最初に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

0