dynamic trace system: xray

dynamic trace system: xray

官方简介见: https://llvm.org/docs/XRay.html
官方用法见: https://llvm.org/docs/XRayExample.html

xray简介

xray由google添加到llvm,用于生产环境中的函数调用追踪工具。我认为这个工具的trace能力能极大方便我们理解开源代码,所以有了这篇博客。

用法

为了记录关键代码,仅记录函数中指令较多的函数(指令数200以上),默认使用-fxray-instrument,若要调整限额,使用-fxray-instruction-threshold=1,
若要在源码级控制那些函数不纪录,那些记录,可以使用attribute,具体参见文档:

[[clang::xray_always_instrument]] void always_instrumented();
[[clang::xray_never_instrument]] void never_instrumented();

缺点

xray对动态库的支持并不好,按照文档对poppler进行编译

#!/bin/bash
OUT_DIR=xray-build
rm -rf $OUT_DIR 
mkdir $OUT_DIR
cd $OUT_DIR
cmake ../poppler \
        -DCMAKE_CXX_COMPILER=/home/tools/clang/current_clang/bin/clang++ \
        -DCMAKE_C_COMPILER=/home/tools/clang/current_clang/bin/clang \
    -DCMAKE_BUILD_TYPE=Release \
        -DCMAKE_C_FLAGS="-g -O0 -fxray-instrument -fxray-attr-list=/home/SourceCode/poppler/poppler-master/xray-attr-list.txt " \
        -DCMAKE_CXX_FLAGS="-g -O0 -fxray-instrument -fxray-attr-list=/home/SourceCode/poppler/poppler-master/xray-attr-list.txt "
make -j8

运行:

XRAY_OPTIONS="patch_premain=true xray_mode=xray-basic verbosity=1 xray_logfile_base=./log.xray-" XRAY_BASIC_OPTIONS="func_duration_threshold_us=0" ./poppler_qt5viewer ~/Documents/Pdf/PLRM.pdf

解析:

llvm-xray  stack  -instr_map=../../libpoppler.so ./log.xray-poppler_qt5viewer.XCHkxB

解析结果缺失了很多函数。

推荐阅读更多精彩内容