嵌入式设备常用性能和内存调试指令
内存问题分析
安装valgrind,按照如下指令执行应用程序:
valgrind --tool=memcheck --leak-check=full --show-leak-kinds=all --undef-value-errors=no --log-file=log ./可执行程序名
结束以后可以查看当前路径下的log文件分析是否存在内存泄漏。
性能测试
android设备通过NDK 使用SimplePerf 抓取火焰图
- 确认python版本是3.10+, 下载并解压NDK
https://googledownloads.cn/android/repository/android-ndk-r26d-linux.zip
- 抓取指定进程的perf.data
cd android-ndk-r26d\simpleperf
python app_profiler.py --pid <pid> -o perf.data -r "-f 1000 --call-graph dwarf -e cpu-cycles -g --duration 3"
注意: 这里 是要抓取perf数据的进程pid,–duration 3 里的3指的是抓取3秒,可以自己调整.
3. 生成perf的html文件
python report_html.py -i perf.data -o perf.html
- 修改 HTML 文件
生成的perf.html
的头是国外网址,国内可能无法打开,使用下面的头替换perf.html
的头内容即可。
<html><head><link rel="stylesheet" type="text/css" href="https://cdn.bootcdn.net/ajax/libs/twitter-bootstrap/4.1.2/css/bootstrap.min.css"></link>
<link rel="stylesheet" type="text/css" href="https://cdn.datatables.net/1.10.19/css/dataTables.bootstrap4.min.css"></link>
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.12.9/umd/popper.min.js"></script>
<script src="https://cdn.bootcdn.net/ajax/libs/twitter-bootstrap/4.1.2/js/bootstrap.min.js"></script>
<script src="https://cdn.datatables.net/1.10.19/js/jquery.dataTables.min.js"></script>
<script src="https://cdn.datatables.net/1.10.19/js/dataTables.bootstrap4.min.js"></script>
<script src="https://www.gstatic.com/charts/loader.js"></script>
<script>google.charts.load('current', {'packages': ['corechart', 'table']});</script>
<style type="text/css">
.colForLine { width: 50px; }
.colForCount { width: 100px; }
.tableCell { font-size: 17px; }
.boldTableCell { font-weight: bold; font-size: 17px; }
</style>
</head>
<body><script>
嵌入式linux抓取特定进程的perf火焰图
进入嵌入式设备执行如下指令:
sudo perf record -e branch-misses --call-graph fp -s -T --sample-cpu -F 100 -p <target_pid> \-o /tmp/perf.data --all-user -g -- sleep <duration>
perf script -i /tmp/perf.data > /tmp/perf.unfold
注意:target_pid 为目标进程的pid, duration为抓取的时间
这样会在单板的/tmp
路径下面生成perf.data
和perf.unfold
文件
然后将这两个文件拉取到PC本地,然后使用本地的perf仓库工具生成火焰图:
./perf/FlameGraphTools/FlameGraph/stackcollapse-perf.pl ./perf.unfold > perf.folded
./perf/FlameGraphTools/FlameGraph/flamegraph.pl ./perf.folded > perf.svg
这样就可以得到火焰图perf.svg
杂记
使用sshpass免输入密码操作scp和ssh:
sshpass -p <password> ssh root@198.168.31.12
sshpass -p <password> scp root@198.168.31.12:/tmp/perf.unfold .
password 为的登陆密码。