linux perf工具生成火焰图
注意:这个脚本依赖编译程序时启用帧指针,也就是CMakeLists.txt的CMAKE_CXX_FLAGS和CMAKE_C_FLAGS中添加-fomit-frame-pointer,如果项目中不让启用帧指针,那就修改perf record -a -g -p <pid>为perf record --call-graph dwarf -p <pid>。
#!/bin/bash
cd "$( cd "$( dirname $0 )" && pwd )"
# sudo passwd
echo 123 | sudo -S service runtime* status
PerfPath=/usr/lib/linux-tools/$(uname -r)
if [ ! -d "$PerfPath" ]; then
sudo apt-get install linux-tools-"$(uname -r)"
fi
if [ ! -f "$PerfPath/perf" ]; then
echo "Perf path error"
exit 0
fi
FlameGraph_PATH="/home/master/FlameGraph"
if [ ! -d "$FlameGraph_PATH" ]; then
echo -e "FlameGraph path error"
exit 0
fi
precise_waiting()
{
if [ $? -ne 0 ]; then
echo "$1 ERROR"
exit 0
fi
while ps -ef | grep "$1" | grep -v grep; do
sleep 1
continue
done
}
do_Log()
{
if [ -f "$2" ]; then
echo "$1 finish"
else
echo "$1 ERROR"
exit 0
fi
}
PID=`ps -aux | grep 'TestProject' | grep -v grep | awk '{print $2}'`
if [ ! -n "$PID" ]; then
echo "TestProject not running"
exit 0
fi
echo "TestProject PID:$PID"
# st1
sudo $PerfPath/perf record -a -g -p $PID
precise_waiting "sudo perf record"
do_Log "record" "perf.data"
# st2
sudo $PerfPath/perf script > out.perf
precise_waiting "sudo perf script"
do_Log "script" "out.perf"
# st3
$FlameGraph_PATH/stackcollapse-perf.pl out.perf > out.folded
precise_waiting "stackcollapse"
do_Log "stackcollapse" "out.folded"
# st4
$FlameGraph_PATH/flamegraph.pl out.folded > TestProject-$PID.svg
precise_waiting "flamegraph"
do_Log "flamegraph" "TestProject-$PID.svg"
sudo rm out.folded out.perf perf.data