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
解析结果缺失了很多函数。