ptraceができない/procでデバッガは何ができますか?

ptraceができない/procでデバッガは何ができますか?

これptraceに関するWikipediaの記事説明する:

コントローラとターゲット間の通信は、ptraceへの反復呼び出しを介して行われ、2つの間に小さな固定サイズのメモリブロックを転送します(呼び出しごとに2つのコンテキストスイッチが必要です)。これは、大量のターゲットメモリにアクセスするときに非常に非効率的です。単語サイズのチャンク(単語ごとに1つのptrace呼び出し)でのみ実行できます。 [7] したがって、Unixバージョン8では、プロセスが他のプロセスのメモリに直接アクセスできるようにするprocfsが導入されています。経由でコピーされました。

より高速なメモリアクセスは、デバッガが興味を持っている唯一のことですが、それは/proc不可能ですかptrace?たとえば、実行中のプログラムに関するより多くのデバッガ関連情報を取得できますか/proc?デバッガに関連するプログラムを操作する他の方法はどうですか?通常、大きなメモリブロックを読み取る/procよりも効率的ですかptrace、それとも大きなメモリブロックを読み取るのがパフォーマンスが著しく低い唯一のケースですか?

答え1

デバッガが別のプロセスにアクセスすることを好む場合は、単語ごとに高価なptrace()システムコールを使用して、一度に1つの機械語にのみアクセスできます。

一方、Procfs は/proc/<pid>/asファイルに表示されるプロセスの完全なアドレス空間を提供します。ファイルread()write()操作に対してlseek()他のプロセスにすばやくアクセスできます。

ptrace()ただし、procfsは、レジスタとアドレス空間へのアクセスだけでなく、シングルステップ実行や同様の機能を提供するよりも、プロセスに関するより多くの情報を提供します。

このtruss(1)ユーティリティは、Roger Faulknerがprocfsの一部として作成しました。これは1986年にprocfsに固有の別のインタフェースに基づいていましたが、SunOSはptrace()1988年にprocfsなしで同じ機能を提供するようにシステムコールを強化しました。 SunOSは関連プログラムを呼び出しますtrace(1)

/proc/<pid>/psinfoProcfsはコマンドも提供しますps。 procfsが利用可能になる前は、プロセスに関する印刷された情報をps実際に読んで/dev/kmemおり、そのような情報を取得する方法によって信頼できませんでした。

注:procfsを介して別のプロセスに移動するには、ioctl()procfsのonaファイルを介して実行され、ptrace()同じ操作を実行するためのシステムコールとしてサブコマンドを提供します。現在、ptrace()これはprocfs機能のためのlibcラッパーとして実装されています。

また、Solarisはprocfsを提供するだけでなく、Sun Microsystemsもprocfsを使用していることに注意してください。ロジャーフォークナーprocfsの発明者。これが彼が他の人と一緒に発展する場所です。プロセスファイルシステム2

Linux で提供される procf は、以下と互換性がありません。プロセス1...でもないプロセスファイルシステム2

Solarisがprocfsを介してptraceを実装しているかどうかを確認するには、以下を参照してください。https://sourceforge.net/p/schillix-on/schillix-on/ci/default/tree/usr/src/lib/libc/i386/sys/ptrace.c

関連情報