性能工具03_tracef安装失败

Tracef

Tracef用途说明

简单来说,分析程序各函数的运行准确时间,最简单的strace,但只能分析内核态的,无法分析用户态的。另一个常用的perf工具,存在较大缺陷(可以分析相对时间占比,但无法分析函数的绝对时间起点终点)。所以需要用户态的类似strace的工具,
找到这篇文章
用户空间程序的函数跟踪器 (Function Tracer):https://www.cnblogs.com/slgkaifa/p/6919967.html

源码下载解压

下载地址:https://i-red.info/docs/rpm/stray_rpms/tracef/
解压:tar -xzvf tracef-0.16.org.tar.gz
后续安装流程

1
2
3
4
$ cd tracef-0.xx  
$ ./configure
$ cd src
$ make

make结果生成的 src/tracef 就是追踪器。

configure报错解决

报错:configure: error: libdwarf is not found

解决:ubuntu中安装libdwarf:www.360doc.com/content/12/0530/10/9012802_214677679.shtml
sudo apt-get install elfutils

报错:configure: error: libiberty is not found

GCC编译器原理(一)03——GCC 工具:gprof、ld、libbfd、libiberty 和libopcodes:https://www.cnblogs.com/kele-dad/p/9471248.html
sudo apt-get install libiberty-dev
sudo apt-get install binutils-dev

报错:configure: error: libboost is not found

sudo apt-get install libboost-all-dev

报错:configure: error: libelf is not found

sudo apt install libelf-dev.

又回到这个问题:configure: error: libdwarf is not found

参考:
编译安装 libdwarf 记录:https://blog.csdn.net/m0_47696151/article/details/121641019
还是不行,
再参考:
Install libdwarf.so on Ubuntu:https://askubuntu.com/questions/502749/install-libdwarf-so-on-ubuntu
sudo apt-get install libelf-dev libdwarf-dev

至此./configure执行ok

Make报错解决

报错:prototype_add_elf


解决:
修改源码,ftrace/prototype.cpp第 38 和 53 行elf& 改为 hoge::elf&

报错:asm/user.h


解决:
修改源码,printer.cpp将第 17 行更改#include <asm/user.h>为#include <sys/user.h>

解决:同上,修改文件trace.cpp

报错:CHAR_BIT

解决:trace.cpp,增加#include

报错:print_insn_i386_att

Compiler error on Fedora:https://github.com/ThoughtGang/opdis/issues/20
尝试:低版本gcc,不好使,脚本使用编译命令是g++
使用低版本g++,7.x不行,6.5不行,5.5

g++5.5报错:uintprt_t


问题:uintptr_t,修改mani.c增加#include <stdint.h>
再次编译,问题依旧在。

根据之前参考文章,这个报错主要原因是头文件应该是opcodes/disassemble.h而非当前dis-asm.h,但本机其实没有opcodes/ disassemble.h

安装opcodes/ disassemble.h

尝试01:安装binutils

https://sourceware.org/legacy-ml/gdb-patches/2017-06/msg00303.html

1
2
3
4
5
6
7
8
9
10
11
12
As a result, these print\_insn\_XXX are not used  
out of opcodes, so this patch also moves their declarations from
include/dis-asm.h to opcodes/disassemble.h. With this change,
GDB doesn't use any print\_insn\_XXX directly any more.
opcodes/disassemble.h.=》
https://fossies.org/linux/binutils/opcodes/disassemble.h

**binutils-2.40.tar.xz**:
=>
Linux下载安装Binutils工具集:https://blog.csdn.net/qq_40994908/article/details/123708345
安装后还是没有opcodes/disassemble.h
此路不通。
尝试02:安装binutils-gdb.git

我想制作 tracef(hogetrce)。错误:未声明 print_insn_i386_att:https://teratail.com/questions/207929
=》
显然,函数 print_insn_i386_att 已从头文件 <dis-asm.h> 移至另一个头文件。
将 print_insn_XXX 移动到操作码内部标头
也许在目的地读取头文件会更好,但如果不存在这样的文件,即使包含似乎是目的地的 opcodes/disassemble.h 也会出错。
=》
https://sourceware.org/git/gitweb.cgi?p=binutils-gdb.git;a=commit;h=88c1242dc0a1e1ab582a65ea8bd05eb5f244c59b
make install报错了,
尝试搜索disassemble.h,

依然找不到。所以说明还是不行

云机器01

sudo apt-get install libelf-dev
sudo apt-get install binutils-dev
sudo apt-get install elfutils
sudo apt-get install libboost-all-dev
sudo apt-get install libelf-dev libdwarf-dev
sudo apt-get install libiberty-dev
sudo apt-get install binutils-dev
下载源码:
wget https://i-red.info/docs/rpm/stray_rpms/tracef/tracef-0.16.org.tar.gz

configure ok


Make


这个是之前遇到过的问题,解决方案同上,类似问题全部忽略,按照之前处理方式即可

报错:print_insn_i386_att

尝试01: 安装binutils

Linux下载安装Binutils工具集:https://blog.csdn.net/qq_40994908/article/details/123708345

1
2
3
4
5
6
wget http://ftp.gnu.org/gnu/binutils/binutils-2.40.tar.gz \# 下载  
tar -xzvf binutils-2.40.tar.gz \# 解压
cd binutils-2.40/ \# 定位到Binutils的目录
./configure --prefix=/usr/local/binutils # 设置安装目录
make \# GNU中的工具
make install \# 执行安装命令

执行make命令时报错:

报错makeinfo


解决:sudo apt-get install texinfo

报错:bison


解决:

1
2
3
4
5
6
7
jq configure: error: You need bison version 3.0 or greater:https://blog.cpming.top/p/configure-error-need-bison-version-30-or-greater  
$ wget ftp://ftp.gnu.org/gnu/bison/bison-3.6.tar.xz
$ tar xf bison-3.6.tar.xz
$ cd bison-3.6
$ ./configure
$ make
$ make install

成功执行,说明bison安装本身是成功的

继续binutil

Make
核实:binutils里面确实有我们需要的h头文件

但不包含再include中,所以
cp –r opcodes include/ #希望make install时自动带过去
make成功

Make install成功

但是,安装后核实,发现好像依然没有disassemble.h文件。

修改:xelf.h文件

Make尝试编译:

通过拷贝头文件,文件夹的方式越过这个问题,可以认为安装binutils的目的达到了。

报错: cannot convert ‘bfd* const’ to ‘const asection’ {aka ‘const bfd_section’}

tracef make操作
xelf.cpp:248:33: error: cannot convert ‘bfd* const’ to ‘const asection’ {aka ‘const bfd_section’}

通过这几个参考
Build failure with binutils@2.34 #242:https://github.com/HPCToolkit/hpctoolkit/issues/242
OProfile Bugs:https://sourceforge.net/p/oprofile/bugs/292/

binutils版本问题

典型版本界限:2.33,2.34,

尝试2.32
1
2
3
4
5
6
7
8
9
10
11
wget http://ftp.gnu.org/gnu/binutils/binutils-2.32.tar.gz \# 下载  
tar -xzvf binutils-2.32.tar.gz \# 解压
cd binutils-2.32/ \# 定位到Binutils的目录
./configure --prefix=/usr/local/binutils # 设置安装目录
make \# GNU中的工具
make install \# 执行安装命令
头文件覆盖:
cd /usr/include; rm -rf opcodes/
cd ~/binutils-2.32; cp -r opcodes /usr/include/
cd /root/tracef-0.16;./configure;cd src;
make clean;make

同样的问题

尝试2.34
1
2
3
4
5
6
7
8
9
10
11
wget http://ftp.gnu.org/gnu/binutils/binutils-2.34.tar.gz \# 下载  
tar -xzvf binutils-2.34.tar.gz \# 解压
cd binutils-2.34/ \# 定位到Binutils的目录
./configure --prefix=/usr/local/binutils # 设置安装目录
make \# GNU中的工具
make install \# 执行安装命令
头文件覆盖:
cd /usr/include; rm -rf opcodes/
cd ~/binutils-2.34; cp -r opcodes /usr/include/
cd /root/tracef-0.16;./configure;cd src;
make clean;make

同样问题

V3报错:checking size of void *… configure: error: cannot compute sizeof (void *), 77


重新解压出新的tracef代码,然后编译,还是这个问题,说明底层某些东西已经不对了。
Gcc,G++版本都是采用较新的,一样的问题

云机器02

Make

报错:print_insn_i386_att

通过apt下载源码binutils-dev

1
2
3
root@iZ2ze18upen0x3frvar3bsZ:~/binutils-2.34# find . -name disassemble.h  
./opcodes/disassemble.h
cp -rf opcodes /usr/include/

修改:xelf.h文件

Make尝试编译:

报错: cannot convert ‘bfd* const’ to ‘const asection’ {aka ‘const bfd_section’}

更新binutil版本
https://launchpad.net/ubuntu/+source/binutils/2.40-2ubuntu1
下载2.40

1
2
3
4
5
6
tar xvJf binutils_2.40.orig.tar.xz  
cd binutils-2.40/
apt-get install texinfo
sudo apt-get install bison
make
make install

头文件覆盖: cp -rf opcodes /usr/include/
回到~/tracef-0.16/src#,依然报错

错误更多了

参考信息

CentOS 7 へ 関数コールトレーサ tracef (hogetrace) をインストール:https://qiita.com/kanejun_x/items/455d2d5dc6cde4d8c337

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×