1

これを文書化するだけです:(従うべき自己回答)

dtraceライセンスの問題により、Sun のパッケージが Ubuntu 用にパッケージ化されていないことは承知しています。だから私はそれをダウンロードし、Ubuntu のソースからビルドしました - しかし、Simple dtraces not working · Issue #17 · dtrace4linux/linux · GitHubのものとほとんど同じような問題を抱えています。つまり、ドライバーのロードは問題ないようです:

dtrace-20130712$ sudo make load
tools/load.pl
23:20:31 Syncing...
23:20:31 Loading: build-2.6.38-16-generic/driver/dtracedrv.ko
23:20:34 Preparing symbols...
23:20:34 Probes available: 364377
23:20:44 Time: 13s

...しかし、単純なスクリプトを実行しようとすると失敗します:

$ sudo ./build/dtrace -n 'BEGIN { printf("Hello, world"); exit(0); }'
dtrace: invalid probe specifier BEGIN { printf("Hello, world"); exit(0); }: "/path/to/src/dtrace-20130712/etc/sched.d", line 60: no symbolic type information is available for kernel`dtrace_cpu_id: Invalid argument

上記の問題リンクに従って:

(ctf にはプライベートで動作する libdwarf ライブラリが必要です - ほとんどの古いリリースには壊れたバージョンがあります)。

...次にlibdwarf、ソースから構築し、それにdtrace基づいて構築しました(簡単ではなく、シンボリックリンクの正しい配置を手動で見つける必要があります)。そして、私はまだ同じ失敗をします。

これを修正することは可能ですか?

4

1 に答える 1

1

さて、 への旅行の後、私は問題がの関数gdbで発生することを理解しました(経由で呼ばれると思います)。その中で、ほとんどの呼び出しが属性/変数を伝播することに気付きました。しかし、障害が発生すると、私は!dtracedt_module_getctfdtrace_symbol_typedt_module_lookup_by_namedm_name = "linux"dm_name = "kernel"

元の60行目sched.dは次のとおりです。

    cpu_id = `dtrace_cpu_id; /* C->cpu_id; */

次に、thr3ads.net - dtrace ディスカッション - 型情報なしのシンボルへのアクセス [2006 年 11 月]を見つけました。このエラー メッセージが記載されている場所:

dtrace: 無効なプローブ指定子 fbt::calcloadavg:entry { printf("CMS_USER: %d, CMS_SYSTEM: %d, cpu_waitrq: %d\n", `cpu0.cpu_acct[0], `cpu0.cpu_acct[1], ` cpu0.cpu_waitrq);}: アクション リスト内: unix のシンボリック型情報がありません`cpu0: シンボルの型情報がありません

そう:

  • そのシステムでは、リクエスト`cpu0.cpu_acct[0]は に解決されましたunix`cpu0
  • 私のシステムでは、リクエスト`dtrace_cpu_idは に解決されましたkernel`dtrace_cpu_id

そして、「バックティック演算子は、実行中のカーネルに固有のカーネル変数の値を読み取るために使用されます。」( CPU 負荷の測定方法 - DTrace 一般的なディスカッション - ArchiveOrange ) から、この「バックティック変数」を明示的に「キャスト」する可能性があると考えました。 」にlinux役立ちます。

そして実際にそうです -sched.dこれに変更する必要があるのは の小さなセクションだけです:

translator cpuinfo_t < dtrace_cpu_t *C > {
    cpu_id = linux`dtrace_cpu_id; /* C->cpu_id; */
    cpu_pset = -1;
    cpu_chip = linux`dtrace_cpu_id; /* C->cpu_id; */
    cpu_lgrp = 0; /* XXX */
/*  cpu_info = *((_processor_info_t *)`dtrace_zero); /* ` */ /* XXX */
};

inline cpuinfo_t *curcpu = xlate <cpuinfo_t *> (&linux`dtrace_curcpu);

...そして突然 - 動き始めます!:

dtrace-20130712$ sudo ./build/dtrace -n 'BEGIN { printf("Hello, world"); exit(0); }'
dtrace: description 'BEGIN ' matched 1 probe
CPU     ID                    FUNCTION:NAME
  1      1                           :BEGIN Hello, world

 

PS:

ヒント 1: 絶対に行わないでくださいdtrace -n '::: { printf("Hello"); }'。これは、「すべてのカーネル イベントで printf を実行する」ことを意味し、カーネルが完全にフリーズします。CTRL-Alt-Del でさえ機能しません!

Protip 2: Debugging DTraceDTRACE_DEBUGのように使用する場合は、次を使用します。sudo -E

dtrace-20130712$ DTRACE_DEBUG=1 sudo -E ./build/dtrace -n 'BEGIN { printf("Hello, world"); exit(0); }'
libdtrace DEBUG: reading kernel .ctf: /path/to/src/dtrace-20130712/build-2.6.38-16-generic/linux-2.6.38-16-generic.ctf
libdtrace DEBUG: opened 32-bit /proc/kallsyms (syms=75761)
...
于 2013-07-27T21:49:17.930 に答える