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 | $ cd tracef-0.xx |
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 | As a result, these print\_insn\_XXX are not used |
尝试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 | wget http://ftp.gnu.org/gnu/binutils/binutils-2.40.tar.gz \# 下载 |
执行make命令时报错:
报错makeinfo
解决:sudo apt-get install texinfo
报错:bison
解决:
1 | jq configure: error: You need bison version 3.0 or greater:https://blog.cpming.top/p/configure-error-need-bison-version-30-or-greater |
成功执行,说明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 | wget http://ftp.gnu.org/gnu/binutils/binutils-2.32.tar.gz \# 下载 |
同样的问题
尝试2.34
1 | wget http://ftp.gnu.org/gnu/binutils/binutils-2.34.tar.gz \# 下载 |
同样问题
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 | root@iZ2ze18upen0x3frvar3bsZ:~/binutils-2.34# find . -name disassemble.h |
修改: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 | tar xvJf binutils_2.40.orig.tar.xz |
头文件覆盖: cp -rf opcodes /usr/include/
回到~/tracef-0.16/src#,依然报错
错误更多了
参考信息
CentOS 7 へ 関数コールトレーサ tracef (hogetrace) をインストール:https://qiita.com/kanejun_x/items/455d2d5dc6cde4d8c337