21

使用されたすべてのシステム コールを追跡できます。

しかし、sys_call と通常の呼び出しの違いは??

4

3 に答える 3

42

マシューが言ったように、strace はptrace(2)システム コールを使用してその魔法を働かせます。ptrace は、別のプログラムが何をしているかを検査する必要があるデバッガーやその他のツールを実装するために使用されます。基本的に、strace は ptrace を呼び出し、ターゲット プロセスにアタッチします。

ターゲットプロセスがシステムコールを行うたびに停止し、strace に通知されます。次に、strace はターゲット プロセスのレジスタとスタックを検査し (これも ptrace を使用)、どのシステム コールが行われたか (各コールには一意の番号があり、レジスタに渡されます) と引数が何であったかを判断します。その後、strace はプロセスを再開します。システムコールから戻ると停止し、再度straceが通知されるので、戻り値を調べることができます。strace は、これが発生するたびにユーザーの情報を出力します。

2 番目の質問への回答として、システム コールはカーネルに実装されるのに対し、通常の関数はユーザー空間に実装されるという点で、システム コールは通常の関数呼び出しとは異なります。しかし、それはまったく別のワームの缶です。

于 2011-07-13T00:24:19.423 に答える
11

strace の仕組みに関するブログ記事と、syscalls の仕組みに関するさらに長いブログ記事を書きました。

straceptraceシステムコールを介してカーネルに出入りするたびに、トレースされているプログラムをカーネルに停止させるシステムコールを使用して機能します。トレース プログラム (この場合straceは ) は、 を使用してプログラムの状態を調べることができptraceます。

straceシステムの動作に応じて、各システム コールの引数を取得します。x86-64 システムでは、システム コールへの引数は CPU レジスタで渡されます。この場合、引数を指定してstrace呼び出しptracePTRACE_GETREGS、レジスタ値のコピーを取得し、それらを出力できます。

于 2016-06-30T17:08:42.017 に答える
1

システムコールは、ユーザー空間とカーネル空間の間のインターフェースです。リストについては、 man 2 syscallsまたはsyscalls.hを参照してください。

などの標準 C ライブラリ関数と混同しないでくださいprintf。これらはしばしば syscall を呼び出しますが、必ずしもそうとは限りません。さらに、ユーザー空間プログラムは、syscall関数を使用して直接 syscall を呼び出すことができます。

于 2011-03-31T01:23:55.643 に答える