問題タブ [ptrace]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
linux - ptraceとスレッド
別のプロセスのスレッドを監視するために、ptraceを組み込んだLinuxアプリケーションに取り組んでいます。私が観察するアプリケーションが子プロセスをフォークするとき、これはすでに非常にうまく機能しています。アプリケーションでwaitpidを呼び出すことにより、監視アプリケーションで次のシグナルを取得できます。
SIGSTOP
子プロセスを形成するSIGTRAP
親から
すべての子を追跡するために、、、、およびを使用してptraceをPTRACE_O_TRACEFORK
設定PTRACE_O_TRACEVFORK
しPTRACE_O_TRACECLONE
ますPTRACE_O_TRACEEXIT
。
子プロセスではすべてが正常に機能していますが、アプリケーションのスレッドを観察することはできません。スレッドを作成するプロセスからを取得しSIGTRAP
ますが、スレッドからシグナルを取得しません。
スレッドと何か特別なものはありptrace
ますか?strace
スレッドを追跡するにはどうすればよいですか(のコードでスレッド専用の特別なルーチンを見つけることができませんでしたstrace
)?
これがptrace
私のアプリケーションでの使用方法です。
- まず、プロセスにアタッチします。
ptrace(PTRACE_ATTACH, pid, NULL, NULL);
- 次に、私は呼び出します
waitpid()
:trace_pid = waitpid(-1, &status, 0);
- オプションを設定
ptrace
します。ptrace(PTRACE_SETOPTIONS, pid, NULL, PTRACE_O_TRACEFORK | PTRACE_O_TRACEVFORK | PTRACE_O_TRACECLONE | PTRACE_O_TRACEEXIT);
pidに接続した後waitpid()
、ループを呼び出しptrace(PTRACE_SETOPTIONS...
て、によって報告されたすべての新しいタスクを呼び出しますptrace
。もちろん、SIGCONT
イベント後の処理でタスクを続行します。
c - x86-64 で ptrace を使用するには?
私はチュートリアルherex86-64
に従っており、コンパイルできるように(基本的にeaxをraxに置き換えるなど)少し変更しました:
しかし、実際には期待どおりに機能しません。常に次のように表示されます。
コードのどこが間違っていますか?
c - ptraceを使用してプロセスをトレースしているときに、WIFSIGNALED(status)がシグナルの検出に失敗するのはなぜですか?
子プロセスをトレースするためにptraceを使用しています。子プロセスが正常に終了すると、完全に機能します。ただし、異常終了すると、マクロWIFSIGNALED(&status)を使用しているにもかかわらず、プログラムは無限ループに入ります。子プロセスの例は次のとおりです。
try.c
そしてここにトレースプログラムがあります
ptraceが使用されていない場合に機能する信号が検出されないのはなぜですか?
c - この ptrace プログラムが、syscall が -38 を返したと言うのはなぜですか?
私が走っていることを除いて、これと同じですexecl("/bin/ls", "ls", NULL);
。
すべてのシステムコールが次のように返されるため、結果は明らかに間違っています-38
。
誰も理由を知っていますか?
アップデート
今問題は次のとおりです。
execve
0
なぜ二度戻ったのですか?
linux - 1つの組み立て命令によるシングルステッププロセス
ptraceを使用してシングルステップ操作を実行すると、プロセスは1行のコードを実行するか、代わりに1行のアセンブリを実行します。前者の場合、1つのプロセッサ命令だけでLinuxのプロセスをステップ実行する方法はありますか?
カーネル内でこれを行うことを意味しますが、GDBソースは一種の大きさであり、ASMシングルステップを実行するために何を行っているかを正確に追跡することは困難です。プロセスをシングルステップにしたいのですが、ptraceのシングルステップの正確な動作がわからないだけです(1命令以上ですか?)
c - ptrace SINGLESTEP が正しく動作しないのはなぜですか?
ptrace API を使用して小さなプログラムをトレースしようとしています。トレーサーが実行されるたびに、悪い結果が生じることがわかりました。これは、トレースしたい短いプログラムの逆アセンブリです。
トレーサー自体のコードは次のとおりです。
トレーサの仕事は、inc_reg16 プログラムをシングル ステップし、遭遇した各プロセッサ命令のアドレスをログに記録することです。命令「inc ax」が何回発生したかを実行して確認すると、トレーサーが実行されるたびに数値が異なることが発生します。
2 番目のチェック:
問題は、命令「inc ax」が正確に 65536 回実行されるため、上記の結果が両方とも 65536 になることです。問題は、私のコードに誤りがあるのか、それとも ptrace のバグの問題なのかということです。よろしくお願いいたします。
c - Ptrace mprotect デバッグの問題
研究プロジェクトで困っています。私がしようとしているのは、ptrace を使用してターゲット プロセスの実行を監視することです。ptrace の助けを借りて、ターゲット コード セグメントに mprotect syscall を挿入し (ブレークポイントに似ています)、スタック保護を PROT_NONE に設定します。その後、元の指示を復元し、ターゲットを続行させます。無効なパーミソン segfault を取得すると、syscall を再度挿入してスタックの保護を解除し、その後、segfault の原因となった命令を実行してスタックを再度保護します。
(これは単純なプログラムでは実際に機能します。)
私の問題は、このセットアップでは、ライブラリ関数呼び出しでターゲット (かなり) がランダムにクラッシュすることです (動的または静的リンクを使用するかどうかに関係なく)。クラッシュするとは、何らかの理由でマップされていないメモリにアクセスしようとするか、関数内でハングし続ける__lll_lock_wait_private
(malloc 呼び出しに続いている) ことを意味します。
クラッシュは常に発生するとは限らず、常に同じ位置で発生するとは限らないことをもう一度強調しましょう。
同期の問題のように聞こえますが、私が知る限り (/proc/pid/tasks/ を調べたということです)、実行中のスレッドは 1 つだけです。
それで、これの理由が何であるかについて何か手がかりはありますか?よくわからない場合でも、提案を教えてください。ここではアイデアが不足しています...
linux - プロセスコンテキストからカーネルのシングルステップをPtraceしますか?
カーネル(この場合はLinux)から、プロセスコンテキスト(システムコール、ページフォールトなど)でPTRACE_SINGLESTEPを使用してptrace_requestを呼び出すとどうなるか疑問に思いました。ユーザースペース命令またはカーネルスペース命令をシングルステップで実行しますか。ptraceはシングルステップのユーザー命令しか実行できないことを理解しています。そのため、これによって生成される動作に興味があります。
もう少し情報を提供するために、ページフォールトハンドラーからそうしようとしています(フォールトした命令をシングルステップしますが、命令が通過するようにPTEを変更します)。これが可能かどうか、または実行するプロセスのスケジュールを変更するなど、別の方法が必要になるのではないかと思います。
これは、プロセスのtask_struct(プリエンプトされた場合)がカーネルスペースハンドラーIIRCをポイントするために発生します。したがって、ptraceを使用したシングルステップはこれをバイパスして正しいユーザースペース命令を実行しますか、それともまったく実行しませんか?
linux - Linuxでvsyscallを無効にする
私は、ptrace(2)を使用して他のプロセスのシステムコールを監視するソフトウェアに取り組んでいます。残念ながら、最近のほとんどのオペレーティングシステムは、Linuxではvsyscallと呼ばれるある種の高速ユーザーモードシステムコールを実装しています。
単一のプロセス、またはそれが不可能な場合はオペレーティングシステム全体でvsyscalls / vDSOの使用を無効にする方法はありますか?
c - システムコールを無視する
ptraceを使用してシステム コールをトラップできることは知っています。しかし、私がやりたいのは、システム コールを無視することです。ptraceがシステム コールをトラップし、その番号を確認して、無視する必要があるシステム コールの番号である場合、ptraceはシステム コールの進行を停止するか、システム コールをすぐに返すことができます。
ポイントは、 ptraceを使用してアプリケーションに特定のシステム コールを無視させる効果を持たせる必要があるということです。