6

私の質問はもっと素朴に聞こえるかもしれません。

しかし、Linuxでユーザースペースからカーネルスペースに対して行われたioctl呼び出しを一覧表示できるかどうかを知りたいと思いました。

4

2 に答える 2

8

LTTngを使用します。これは最新の Linux カーネル トレーサー (ユーザー ランドでも動作) で、Ubuntu、Fedora、Arch Linux、Debian、または openSUSE を使用している場合に数秒でインストールされます (パッケージとして入手可能)。それ以外の場合でも、tarballを取得してインストール手順に従うのは簡単です。

トレース

次のようなトレースを作成します。

$ sudo lttng create mySession
Session mySession created.
Traces will be written in /home/user/lttng-traces/mySession-20120619-103600
$ sudo lttng enable-event -k -a --syscall
All kernel system calls are enabled in channel channel0
$ sudo lttng start
Tracing started for session mySession

次に、通常のことを行います。を含むすべてのシステム コールは、ioctl興味深いパラメータを使用して LTTng によって記録/キャプチャされます。トレースが/home/user/lttng-traces/mySession-20120619-103600ディレクトリに書き込まれています。録音が終了したら、次の操作を行います。

$ sudo lttng stop
Tracing stopped for session mySession
$ sudo lttng destroy
Session mySession destroyed at /home/ephipro

ここdestroyでは良く聞こえませんが、実際にはトレース ファイルが破棄されるわけではありません。すべてをフラッシュし、ファイルへのリンクを解放するだけです。

sudoカーネルイベントをトレースしているため、どこでも必要です。明らかなセキュリティ上の理由から、すべてのシステム コールとそのパラメータをユーザーに見せたくない場合。

トレースの表示

2 つの主要なビューアが現在利用可能です。Babeltraceは、キャプチャされたすべてのイベントのテキスト出力を提供します。apt-get( babeltrace)を使用して取得できるはずです。それ以外の場合は、最新の tarballを取得してください。次に、巨大なダンプ Babeltrace 出力から呼び出しgrepを抽出するために使用します。ioctl

$ sudo babeltrace /home/user/lttng-traces/mySession-20120619-103600 | grep ioctl
[10:36:41.795425690] (+0.000001403) sys_ioctl: { 1 }, { fd = 18, cmd = 62981, arg = 0 }
[10:36:41.795435996] (+0.000000610) sys_ioctl: { 1 }, { fd = 18, cmd = 2148070920, arg = 139928632507464 }
[10:36:41.795573431] (+0.000008840) sys_ioctl: { 1 }, { fd = 18, cmd = 62982, arg = 4096 }
[10:36:41.795591089] (+0.000000854) sys_ioctl: { 1 }, { fd = 18, cmd = 62981, arg = 38520960 }
[10:36:41.795595956] (+0.000000434) sys_ioctl: { 1 }, { fd = 18, cmd = 2148070920, arg = 139928632507464 }
[10:36:41.796125261] (+0.000006110) sys_ioctl: { 1 }, { fd = 18, cmd = 62982, arg = 0 }
[10:36:41.796185722] (+0.000000947) sys_ioctl: { 1 }, { fd = 18, cmd = 62981, arg = 38530304 }
[10:36:41.796192688] (+0.000000628) sys_ioctl: { 1 }, { fd = 18, cmd = 2148070920, arg = 139928632507464 }
[10:36:41.797155511] (+0.000003280) sys_ioctl: { 0 }, { fd = 18, cmd = 62982, arg = 0 }
[10:36:41.797202362] (+0.000001995) sys_ioctl: { 0 }, { fd = 18, cmd = 62981, arg = 38529760 }
...

ここに表示されるのは、イベントが発生した時刻、イベント名、およびそのすべてのパラメーターと値です。

Eclipse は、Linux ツール プラグイン プロジェクト内に完全な LTTng ビューアーも備えています。簡単な手順は次のとおりです。

  1. eclipse.org のダウンロード ページに移動します。
  2. Developer Buildsに(Eclipse Juno が数日後にリリースされるまで)、Eclipse IDE for C/C++ Developers を入手してください。
  3. 解凍して起動

Eclipse Juno 以降、Linux ツールは C/C++ 開発者向けの Eclipse IDE に組み込まれています。

その後、新しいトレース プロジェクトを作成し、トレースをインポートできます。Tracingパースペクティブを開くと、イベントを視覚化するための便利なビューにアクセスできます。ヒストグラムビューとイベントビューの例を次に示します。

Eclipse LTTng ビューア

ここでは、[イベント] ビューを使用してioctl通話のみを保持しています。コンテンツとタイム スタンプが Babeltrace の出力と一致していることがはっきりとわかります。

于 2012-06-19T15:11:25.150 に答える
2

やってみましたstraceか?すべてのシステムコールが一覧表示されます。

于 2012-06-19T09:05:34.340 に答える