Dtrace没有收集NodeJS的任何数据

我试图用Dtrace来分析NodeJS,但是它没有正常工作。 我正在使用的命令是:

dtrace -n 'profile-97/execname == "node" && arg1/{@[jstack(150, 8000)] = count(); } tick-60s { exit(0); }' > stacks.out 

我得到的输出是:

 CPU ID FUNCTION:NAME 0 312432 :tick-30s 

如果我做dtrace -l然后我得到例如:

 58814 instr kernel setup_APIC_eilvt-jne 0xffffffff81045e27 58815 instr kernel setup_APIC_eilvt-je 0xffffffff81045e34 58816 instr kernel setup_APIC_eilvt-je 0xffffffff81045e38 58817 instr kernel setup_APIC_eilvt-callr 0xffffffff81045e46 58818 instr kernel setup_APIC_eilvt-callr 0xffffffff81045e6a 58819 instr kernel lapic_timer_setup.part.4-cli 0xffffffff81045ea0 58820 instr kernel lapic_timer_setup.part.4-jbe 0xffffffff81045eaa 58821 instr kernel lapic_timer_setup.part.4-jbe 0xffffffff81045eaf 58822 instr kernel lapic_timer_setup.part.4-callr 0xffffffff81045ed4 58823 instr kernel lapic_timer_setup-je 0xffffffff81045f39 58824 instr kernel lapic_timer_setup-repz 0xffffffff81045f3b 58825 instr kernel local_apic_timer_interrupt-je 0xffffffff81045f74 58826 instr kernel local_apic_timer_interrupt-callr 0xffffffff81045f90 58827 instr kernel local_apic_timer_interrupt-je 0xffffffff81045f99 58828 instr kernel clear_local_APIC-jne 0xffffffff8104610e 58829 instr kernel clear_local_APIC-jg 0xffffffff810461c3 58830 instr kernel clear_local_APIC-je 0xffffffff8104629a 58831 instr kernel disable_local_APIC-jne 0xffffffff810463bd 58832 instr kernel disable_local_APIC-je 0xffffffff810463c7 58833 instr kernel disable_local_APIC-callr 0xffffffff810463c9 58834 instr kernel disable_local_APIC-repz 0xffffffff81046400 58835 instr kernel lapic_suspend-jne 0xffffffff8104641d 58836 instr kernel lapic_suspend-jg 0xffffffff81046555 58837 instr kernel lapic_suspend-cli 0xffffffff81046561 58838 instr kernel lapic_suspend-callr 0xffffffff81046568 

如果我列出所有打开文件的进程:

 dtrace -q -n syscall::open:entry'{ printf("%-16s%-16s\n", execname,copyinstr(arg0)); }' 

我得到所有的进程打开文件,甚至显示NodeJS开始准备工作:)

 vminfo /var/run/utmp vminfo /var/run/utmp systemd /proc/145/cgroup vminfo /var/run/utmp vminfo /var/run/utmp vminfo /var/run/utmp vminfo /var/run/utmp systemd /proc/460/cgroup vminfo /var/run/utmp vminfo /var/run/utmp node /etc/ld.so.cache node /lib/x86_64-linux-gnu/libdl.so.2 node /lib/x86_64-linux-gnu/librt.so.1 node /usr/lib/x86_64-linux-gnu/libstdc++.so.6 node /lib/x86_64-linux-gnu/libm.so.6 node /lib/x86_64-linux-gnu/libgcc_s.so.1 node /lib/x86_64-linux-gnu/libpthread.so.0 node /lib/x86_64-linux-gnu/libc.so.6 node /dev/urandom node /home/davidgatti/test/ble.js node /etc/resolv.conf node /etc/nsswitch.conf node /dev/urandom node /dev/pts/0 node /dev/null node /dev/pts/0 vminfo /var/run/utmp vminfo /var/run/utmp systemd /proc/145/cgroup 

我做错了什么? 我应该如何探测NodeJS或其他进程来获取一些有用的信息?

可悲的是,这在Linux下不起作用,因为Dtrace严格与系统内核绑定。

Dtrace例如在macOS或Solaris下工作,因为有一个版本的内核,如果有任何更改,作者可以做适当的改变为Dtrace。

由于不仅Linux在每个发行版中都有许多不同的内核,所以您可以自由编译自己的版本,这意味着无法为此系统创build工作的Dtrace。

由于Dtrace需要挂钩内核的特定部分才能跟踪应用程序内部正在进行的操作。

您可以在原始Dtrace for linux回购的Issue部分阅读更多。