如何在嵌入式Linux机器上运行valgrind以查找主软件中的内存泄漏?
在rcS
脚本中,我的运行方式如下:
./main_app
如何将./main_app
程序与valgrind相关联? main_app进程永远不会终止。
我想不断将数据记录到文件中。此外,我想访问日志文件而不终止main_app
进程。我可以做telnet并可以访问日志文件。但问题是,除非处理程序关闭,否则如何打开文件,即我不太明白哪个valgrind参数控制如何将内存泄漏记录到文件中。请帮忙!
答案 0 :(得分:6)
您可以尝试使用自己的mips来构建它,这里的步骤如下: 从这里下载valgrind http://valgrind.org/downloads/ - 我使用了Valgrind 3.8.1 用valgrind解压缩归档并移动到valgrinds文件夹 执行:
./autogen.sh
./configure --host=mipsel-linux-gnu --prefix=/home/pub/valgrind CFLAGS="-mips32r2" CC=/opt/toolchains/mips-4.3/bin/mips-linux-gnu-gcc CXX=/opt/toolchains/mips-4.3/bin/mips-linux-gnu-c++
./make -j6
./make install
在目标mips框导出路径到valgrind lib文件夹:
export VALGRIND_LIB=/mnt/nfs/lib/valgrind
现在您可以像往常一样使用它,以便查看内容http://valgrind.org/docs/manual/mc-manual.html 它对我有用,祝你好运。
答案 1 :(得分:0)
Valgrind仅适用于x86。如果您为x86构建应用程序并在那里使用valgrind运行它,您仍然可以追踪泄漏。这个问题不太可能是针对目标架构的。
答案 2 :(得分:0)
上面的答案描述了如何构建valgrind但实际得到完整的泄漏检查,而不仅仅是一个内存问题列表,你的程序必须终止,我猜你永远不会终止你的程序。
假设你的进程是某种守护进程,你最好的选择就是在循环中运行它,用top
监视内存使用情况,然后当你看到内存使用量过大的迹象时,以某种方式向它发送一个关闭命令。如果您随后使用以下选项运行valgrind,您将获得每个进程运行的唯一日志,包括退出时的泄漏转储:
while true ; do
valgrind --leak-check=yes --log-file=/tmp/log.%p.txt main_app
sleep 1
done
文件名中的%p
会插入进程ID。
您还可以指定--show-possibly-lost=no
,这将减少报告给valgrind具有更高置信度的人的泄漏量。