使用されたすべてのシステム コールを追跡できます。
しかし、sys_call と通常の呼び出しの違いは??
マシューが言ったように、strace はptrace(2)システム コールを使用してその魔法を働かせます。ptrace は、別のプログラムが何をしているかを検査する必要があるデバッガーやその他のツールを実装するために使用されます。基本的に、strace は ptrace を呼び出し、ターゲット プロセスにアタッチします。
ターゲットプロセスがシステムコールを行うたびに停止し、strace に通知されます。次に、strace はターゲット プロセスのレジスタとスタックを検査し (これも ptrace を使用)、どのシステム コールが行われたか (各コールには一意の番号があり、レジスタに渡されます) と引数が何であったかを判断します。その後、strace はプロセスを再開します。システムコールから戻ると停止し、再度straceが通知されるので、戻り値を調べることができます。strace は、これが発生するたびにユーザーの情報を出力します。
2 番目の質問への回答として、システム コールはカーネルに実装されるのに対し、通常の関数はユーザー空間に実装されるという点で、システム コールは通常の関数呼び出しとは異なります。しかし、それはまったく別のワームの缶です。
strace の仕組みに関するブログ記事と、syscalls の仕組みに関するさらに長いブログ記事を書きました。
straceptraceシステムコールを介してカーネルに出入りするたびに、トレースされているプログラムをカーネルに停止させるシステムコールを使用して機能します。トレース プログラム (この場合straceは ) は、 を使用してプログラムの状態を調べることができptraceます。
straceシステムの動作に応じて、各システム コールの引数を取得します。x86-64 システムでは、システム コールへの引数は CPU レジスタで渡されます。この場合、引数を指定してstrace呼び出しptraceてPTRACE_GETREGS、レジスタ値のコピーを取得し、それらを出力できます。
システムコールは、ユーザー空間とカーネル空間の間のインターフェースです。リストについては、 man 2 syscallsまたはsyscalls.hを参照してください。
などの標準 C ライブラリ関数と混同しないでくださいprintf。これらはしばしば syscall を呼び出しますが、必ずしもそうとは限りません。さらに、ユーザー空間プログラムは、syscall関数を使用して直接 syscall を呼び出すことができます。