dtrace: 编译脚本失败 找不到预处理器

Posted

技术标签:

【中文标题】dtrace: 编译脚本失败 找不到预处理器【英文标题】:dtrace: failed to compile script Preprocessor not found 【发布时间】:2012-11-16 11:48:26 【问题描述】:

我正在尝试在 Ubuntu 10.04 上测试 this script from oracle to get active NFS clients,但我无法让它运行。

为了实现这一点,我首先在these instructions 之后安装了 dtrace。这正是我所做的:

apt-get install bison flex zlib1g-dev libelf-dev binutils-dev libdw-dev libc6-dev-i386
wget ftp://crisp.dyndns-server.com/pub/release/website/dtrace/dtrace-20121009.tar.bz2
tar xfj dtrace-20121009.tar.bz2
cd dtrace-20121009
make all
make install
make load

但是,我在编译时收到此警告:

=================================================================
=== You need /usr/lib/libdwarf.a and /usr/lib/libbfd.a installed to build.
=== 
=== apt-get install binutils-dev
=== apt-get install libdw-dev
=== 
=== Without these, we will not build ctfconvert (needed for 
=== SDT structure definitions).
=================================================================
cd cmd/instr ; make --no-print-directory
cd usdt/c ; make --no-print-directory
tools/mkdriver.pl all
Executing: /usr/src/dtrace/dtrace-20121009/tools/make-me
make -C /lib/modules/2.6.38-16-server/build M=/usr/src/dtrace/dtrace-20121009/build-2.6.38-16-server/driver
  CC [M]  /usr/src/dtrace/dtrace-20121009/build-2.6.38-16-server/driver/systrace.o
  LD [M]  /usr/src/dtrace/dtrace-20121009/build-2.6.38-16-server/driver/dtracedrv.o
  Building modules, stage 2.
  MODPOST 1 modules
  LD [M]  /usr/src/dtrace/dtrace-20121009/build-2.6.38-16-server/driver/dtracedrv.ko
tools/mkctf.sh
build/ctfconvert not available - so not building the linux.ctf file
NOTE: The build is complete, but build/ctfconvert is not available.
      This means you will get run time errors from the io.d and sched.d files
      due to undefined kernel structure definitions. Simply delete or rename
      these files until a fix can be put in place to handle older
      distros which do not have the required libdwarf dependencies.

      (Typical error is references to undefined struct definitions such
      as dtrace_cpu_t).

sync

我已经安装了libdw-devbinutils-dev,但是看一下makefile,它似乎在寻找libdwarf.so,而我系统上的libdw 被命名为libdw.so

为了规避这个问题,我用ln -s /usr/lib/libdw.so /usr/lib/libdwarf.so 创建了一个符号链接。这样做后,编译失败。

cd cmd/ctfconvert ; make --no-print-directory
gcc -g -I. -I../../ -I../../libctf -I../../common -I../../uts/common -I../../linux -I/usr/include/libdwarf -c dwarf.c
In file included from dwarf.c:94:
/usr/include/dwarf.h:56: error: expected identifier before numeric constant
/usr/include/dwarf.h:136: error: expected identifier before numeric constant
/usr/include/dwarf.h:321: error: expected identifier before numeric constant
/usr/include/dwarf.h:461: error: expected identifier before numeric constant
/usr/include/dwarf.h:517: error: expected identifier before numeric constant
make[3]: *** [../../build/ctfconvert.obj/dwarf.o] Error 1
make[2]: *** [all] Error 2
make[1]: *** [do_cmds] Error 2
tools/bug.sh
make: *** [all] Error 1

所以,让我们撤消它。我删除了符号链接,再次编译,运行make installmake load,希望一切都好。一切似乎都很好。

但是,然后我尝试运行上面提到的脚本,它失败了:

# ./get_ngs_clients.d 
dtrace: failed to compile script ./get_ngs_clients.d: Preprocessor not found

我不知道发生了什么。我已经安装了 gcc,以防万一。

# dpkg -l | grep gcc
ii  gcc                                    4:4.4.3-1ubuntu1                  The GNU C compiler
ii  gcc-4.4                                4.4.3-4ubuntu5.1                  The GNU C compiler
ii  gcc-4.4-base                           4.4.3-4ubuntu5.1                  The GNU Compiler Collection (base package)
ii  gcc-4.4-multilib                       4.4.3-4ubuntu5.1                  The GNU C compiler (multilib files)
ii  gcc-multilib                           4:4.4.3-1ubuntu1                  The GNU C compiler (multilib files)
ii  lib32gcc1                              1:4.4.3-4ubuntu5.1                GCC support library (32 bit Version)
ii  libgcc1                                1:4.4.3-4ubuntu5.1                GCC support library

【问题讨论】:

你解决过这个问题吗? 不,抱歉。我最终使用其他方法来处理 dtrace 旨在解决的问题。 谢谢豪尔赫!我会继续寻找。 【参考方案1】:

如果您的系统上没有 libdwarf.a,则不会构建 ctfconvert 工具。 (libdwarf.a 和 libdw.a 不一样)。

如果 ctfconvert 未构建,则您自己的任何脚本或 dtrace etc/*.d 脚本可能无法加载。 (Dtrace force 会自动为您加载这些脚本,这很烦人)。任何依赖结构定义的脚本都会失败。

截至 2013 年 5 月,我正在研究更新到 libdw.a 需要什么,因为这似乎是 libdwarf 的现代替代品。

(由 DTrace/Linux 的“作者”发布)。

【讨论】:

【参考方案2】:

您是否尝试将 --enable-dtrace=false 添加到 /.configure? 或者也许 --with-dtrace=false?

我认为这应该可以解决问题......

【讨论】:

以上是关于dtrace: 编译脚本失败 找不到预处理器的主要内容,如果未能解决你的问题,请参考以下文章

颤振测试失败。找不到编译器错误获取器'main'

在架构 + 链接器命令中找不到符号失败,退出代码为 1

autotools,如果找不到交叉编译器,如何失败

iis7.5找不到FastCgi设置,该怎么处理

iis7.5找不到FastCgi设置,该怎么处理

为 Objective-C 对象定义 DTrace 兼容结构