2013-07-27 23 views
1

只是记录下来:(自我跟随)在Linux中修复dtrace'no symbolic type information'?

我知道Sun的dtrace由于许可问题而没有打包到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;我仍然得到同样的失败。

可以解决这个问题吗?

回答

1

好了,去一趟gdb后,我计算过,在dtrace的功能dt_module_getctf出现问题(通过dtrace_symbol_type打来电话,我想,dt_module_lookup_by_name)。其中,我注意到大多数调用传播属性/变量dm_name = "linux";但是当发生故障时,我会得到dm_name = "kernel"

注意,从sched.d原线60:

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

后来我发现thr3ads.net - dtrace discuss - accessing symbols without type info [Nov 2006];其中提到的此错误消息:

则dtrace:无效探测符FBT :: calcloadavg:条目{ 的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

而且,由于“反引号运算符是用来读取 价值内核的变量,这将是具体到正在运行的内核。”(howto measure CPU load - DTrace General Discussion - 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:

Protip 1:从不做dtrace -n '::: { printf("Hello"); }' - 这意味着“在每个内核事件上执行printf”,并且它会完全冻结内核;即使CTRL-Alt-Del也不行!

普罗蒂普2:如果你想使用DTRACE_DEBUGDebugging DTrace,使用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) 
...