問題タブ [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 のみを使用して「バックトレース」(gdb など) を取得する方法 (Linux、x86/x86_64)
backtracegdb のように出力を取得したい。ptrace()しかし、私は直接これをやりたいです。私のプラットフォームは Linux、x86 です。そして、それ以降は x86_64 です。
ここで、シンボル名に変換せずに、スタックからリターン アドレスのみを読み取りたいと考えています。
したがって、テストプログラムの場合、次の-O0モードでコンパイルされgcc-4.5ます。
私は自分のプログラムを開始し、ptrace最初にプログラムをテストするために接続します。次に、PTRACE_CONT を実行し、シグナルを待ちます。テスト プログラムが自己停止を行う場合。信号は私のプログラムに配信されます。この時点でリターン アドレスを読みたいと思いますが、次のようになります (kill機能が現在アクティブであるため)。
で現在停止しているテスト プロセスのリターン アドレスを見つけるにはどうすればよいptraceですか? フレームにループが発生しますか? そのようなループをいつ停止する必要がありますか?
PS: はい、これも考え方がbacktrace(3)libc 関数に非常に似ていますが、ptrace を介して外部でこれを実行したいと考えています。
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。
誰も理由を知っていますか?
アップデート
今問題は次のとおりです。
execve0 なぜ二度戻ったのですか?
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の使用を無効にする方法はありますか?