問題タブ [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.

0 投票する
8 に答える
18044 参照

c - OS Xで他のプロセスのメモリを読んでいますか?

Mac OS X で他のプロセスのメモリを読み取る方法を理解しようとしてきましたが、うまくいきません。ptracewithなどを使用してオンラインで多くの例を見てきましたが、BSD [ ]PEEKDATAにはそのオプションがありません。man ptrace

Mac OS X で別のプロセスのメモリを読み書きするにはどうすればよいですか?

0 投票する
3 に答える
509 参照

cross-platform - クロス プラットフォームのファイル アクセス トラッキング

特定のプログラム呼び出しのファイルの読み取り/書き込みを追跡できるようにしたいと考えています。関連するファイル名だけで、実際のトランザクションに関する情報は必要ありません。

これに対するクロスプラットフォームのソリューションはありますか?
さまざまなプラットフォーム固有のメソッドとは何ですか?
Linux では、strace/ptrace があることを知っています (より高速な方法があれば、それも良いでしょう)。
Mac OS には ktrace があると思います。
Windowsはどうですか?

また、後でファイル アクセスをブロック (ストール アウト) できるようになれば素晴らしいと思います。

ありがとう!

0 投票する
1 に答える
5963 参照

windows - Windows XP/2003のLinuxptracesyscallのようなものはありますか?

Windowsのプロセスによって実行される特定のシステムコールの監視を読んで、 ptraceシステムコールまたはプログラムによる回避策に相当するWindowsについて疑問に思っています。

私は答えを持っていましたWindowsのLinuxptraceシステムコールのようなものはありますか?、ただし、最新のWindowsバージョンが必要です。

0 投票する
6 に答える
1445 参照

linux - トレースされたプロセスのメモリ空間にアクセスするオーバーヘッドの少ない方法は?

ptrace された子プロセスのメモリ空間に (読み取り操作と書き込み操作の両方で) アクセスする効率的な方法を探しています。アクセスされるブロックのサイズは、数バイトから数メガバイトまで変化する可能性があるため、一度に 1 ワードだけを読み取り、呼び出されるたびにコンテキストを切り替えるptrace 呼び出しをPTRACE_PEEKDATAandで使用することは、無意味なリソースの浪費のように思えます。PTRACE_POKEDATAただし、私が見つけた唯一の代替ソリューションは/proc/<pid>/memファイルでしたが、それはずっと前に読み取り専用になりました。

その仕事をする他の(比較的簡単な)方法はありますか?理想的な解決策は、子プロセスのアドレス空間を親プロセスと何らかの方法で共有し、単純な memcpy 呼び出しを使用して必要なデータを双方向にコピーすることですが、その方法とどこから始めればよいかわかりません。

何か案は?

0 投票する
2 に答える
3198 参照

linux - 複数のスレッドを使用してアプリケーションをptraceできますか?

私は主にLinuxをターゲットとするGUI指向のデバッガーを書いていますが、将来的には他のOSへの移植を計画しています。GUIは常にインタラクティブである必要があるため、さまざまな処理を行うスレッドがいくつかあります。

主に、waitpidが戻るのを待ってループし、受信したイベントを他のスレッドに配信する「デバッグイベント」スレッドがあります。これを行うのは、waitpidにタイムアウトがないため、他のイベントループと統合して応答性を維持することが非常に困難になるためです(waitpidは無期限にハングする可能性があります)。

この戦略は、これまでのLinuxビルドでうまく機能しました。最近、デバッガースレッドを認識させようとしています(デバッガー自体ではなく、デバッグされたアプリケーションのスレッドのように)。

そこで、クローンイベントを追跡するようにptraceオプションを設定し、上位16ビットがに設定されているステータスを探しますPTRACE_EVENT_CLONE。次にPTRACE_GETEVENTMSG、新しいスレッドのTIDを取得するために使用します。これはすべて、私の小さなテストハーネスアプリケーションでうまく機能します。しかし、何らかの理由で、そのコードを実際のデバッガーに配置すると失敗します。(「そのようなプロセスはありません」というエラーコードが表示されます)

私が思いついたのは、Windowsには、アプリケーションに接続されたスレッドだけがデバッグイベントをリッスンできるというルールがあるということです。Linuxのptraceにも同様の制限がありますか?もしそうなら、なぜ私のコードは他のデバッグイベントで機能するのですか?

編集:

少なくともwaitpidは別のスレッドからの待機をサポートしているようです。manページには次のように書かれています。

Linux 2.4より前は、スレッドはプロセスの特殊なケースでした。その結果、別のスレッドが同じスレッドグループに属している場合でも、あるスレッドは別のスレッドの子を待つことができませんでした。ただし、POSIXはそのような機能を規定しており、Linux 2.4以降、スレッドは同じスレッドグループ内の他のスレッドの子を待機できます。デフォルトでは待機します。

したがって、これはせいぜいptraceの制限です。

0 投票する
2 に答える
1327 参照

c - PTRACE_SINGLESTEP を使用したプロセスの機械語命令のカウント

Linux マシンで、PTRACE_SINGLESTEP パラメーターを指定して ptrace を使用して、プログラムのマシン命令の数をカウントしています。この記事に従いました: http://www.ncsu.edu/it/mirror/ldp/LDP/LGNET/81/sandeep.html

しかし、結果は私には奇妙に思えます。非常に単純なプログラムの場合、95000 以上の機械語命令がカウントされます。テストプログラムは

何が起きてる?記事のコードは間違っていますか? (何が問題なのかわかりません。) そうでない場合、そのような単純なプログラムに 95000 を超える命令が必要になる原因は何ですか?

0 投票する
2 に答える
1083 参照

linux - CPUID命令をトラップする方法を探しています

LinuxプロセスのCPUID命令をトラップしていじるきちんとした方法を探しています。ptrace() をいじって、プロセスによって作成されたすべての実行可能な mmap 領域内のすべての cpuid オペコードにパッチを適用し、それらを int3 に置き換えました。CPUID オペコード バイトが他の長いオペコードの一部として頻繁に現れるため、うまく機能しませんでした。

基本的に、特定のメモリアドレスではなく、オペコードの呼び出しごとにブレークポイントを設定できる方法を探しています。誰でもそれを行う方法を知っていますか?

0 投票する
2 に答える
4968 参照

linux - 親プロセスのptrace'ing

子プロセスはptraceシステムコールを使用してその親をトレースできますか?

OsはLinux2.6です

ありがとう。

upd1:「それ自体」からprocess1をトレースしたい。ptrace(process1_pid, PTRACE_ATTACH)不可能なので、子プロセスからフォークしてやってみます。しかし、私にはできません。カーネルが子の親プロセスのトレースを禁止しているなど、奇妙なエラーがあります

UPD2:このようなトレースはセキュリティポリシーによって禁止できます。どのポリシーがこれを行いますか?カーネルのチェックコードはどこにありますか?

UPD3:組み込みLinuxでは、PEEKDATAでエラーは発生しませんが、GETREGSではエラーが発生しません:

errno = EPERM

0 投票する
2 に答える
1964 参照

c - ptrace された Linux プロセス内で ptrace を呼び出す

ウィキペディアの「ptrace」記事に、Linux では、ptrace されたプロセス自体が別のプロセスを ptrace できないと主張する人が追加されました。私は、それが事実であるかどうか (また、そうである場合はその理由) を判断しようとしています。以下は、これをテストするために考案した簡単なプログラムです。私のプログラムは失敗します (サブサブプロセスが正しく実行されません) が、それは私のエラーであり、基本的なものではないと確信しています。

本質的に、最初のプロセスAはプロセスBを fork し、プロセス B はCを fork します。Aはその子Bを ptrace し、Bはその子Cを ptrace します。セットアップが完了すると、3 つのプロセスすべてが、 1 秒ごとに print AB、またはstdout に書き込まれます。C

実際には、ABは問題なく動作しますが、Cは 1 回しか印刷されず、スタックしてしまいます。で確認すると、 Cがカーネル関数でスタックしていることがps -eo pid,cmd,wchan示されますが、残りは3 つすべてが期待される場所にあります。ptrace_stophrtimer_nanosleep

非常にまれに 3 つすべてが機能する (したがって、プログラムは A と B だけでなく C も出力します)。

何が間違っているかについての私の推測は次のとおりです。

  • AがBSIGCHLDに関連するaを見て、 a がCへのシグナルと関係があることを確認し、 wait(2) が両方をBから来ていると報告している(ただし、両方の pid への PTRACE_CONT のハッキーな呼び出しは問題を解決しません)?SIGCHLD
  • CはBによって ptrace されるべきです- Cは代わりにAによってptraceを継承しましたか?

誰かが私が間違っていることを理解できますか? ありがとう。

0 投票する
1 に答える
2732 参照

linux - シグナルの送信者を検出する (linux、ptrace)

プロセスに直接配信されたシグナルとデバッガー経由で配信されたシグナルを区別できますか?

ケース 1:

ケース 2:

では、デバッガーによって再配信されたのか、システムによって送信されたのか、シグナルハンドラーでどのように検出できますか?

OSはLinux、カーネルは2.6.30。プログラムはプレーンな C で書かれています。実際のプログラムでは SIGALRM が使用されますが、それは ではなく で生成されalarm()ますsetitimer()