【发布时间】:2016-06-21 08:10:13
【问题描述】:
当我在下面的程序上运行 valgrind 时,我在 Linux 上得到了格式错误的 XML 输出。
#include <stdio.h>
int main(int argc, char ** argv)
{
FILE *pf = popen("echo test","r");
if( pf != NULL )
{
char data[512];
while (fgets(data,512,pf) != NULL)
{
printf("%s\n",data);
}
pclose(pf);
}
return 0;
}
我使用以下命令运行 valgrind:
valgrind --tool=memcheck --error-limit=no --gen-suppressions=no --num-callers=50 --leak-check=full --trace-children=yes --xml=yes - -xml-file=test.xml ./myProgam
似乎使用 popen 会生成格式错误的 XML 输出。 这是一个get的输出,在序言中我得到了shell命令“echo test”而不是我的程序
<?xml version="1.0"?>
<valgrindoutput>
<protocolversion>4</protocolversion>
<protocoltool>memcheck</protocoltool>
<preamble>
<line>Memcheck, a memory error detector</line>
<line>Copyright (C) 2002-2012, and GNU GPL'd, by Julian Seward et al.</line>
<line>Using Valgrind-3.8.1 and LibVEX; rerun with -h for copyright info</line>
<line>Command: /bin/sh -c echo test</line>
</preamble>
<pid>39938</pid>
<ppid>39877</ppid>
<tool>memcheck</tool>
<args>
<vargv>
<exe>/usr/bin/valgrind</exe>
<arg>--tool=memcheck</arg>
<arg>--error-limit=no</arg>
<arg>--gen-suppressions=no</arg>
<arg>--num-callers=50</arg>
<arg>--leak-check=full</arg>
<arg>--trace-children=yes</arg>
<arg>--xml=yes</arg>
<arg>--xml-file=test.xml</arg>
</vargv>
<argv>
<exe>/bin/sh</exe>
<arg>-c</arg>
<arg>echo test</arg>
</argv>
</args>
<status>
<state>RUN
<status>
<state>FINISHED</state>
<time>00:00:00:00.805 </time>
</status>
<errorcounts>
</errorcounts>
<suppcounts>
<pair>
<count>4</count>
<name>U1004-ARM-_dl_relocate_object</name>
</pair>
<pair>
<count>2</count>
<name>glibc-2.5.x-on-SUSE-10.2-(PPC)-2a</name>
</pair>
</suppcounts>
</valgrindoutput>
)-2a</name>
</pair>
</suppcounts>
</valgrindoutput>
我可以使用 popen 和 valgrind,有不兼容的问题吗?
作为一种解决方法,我设置了选项 --trace-children=no 并且我没有遇到此问题。但是如果我的程序 fork 一个新进程,Valgrind 将不会对其进行分析。
【问题讨论】:
-
popen()输出什么?你没有发。您也没有检查来自fgets()的返回值。 -
我为
popen()和fgets()添加了一个返回值检查。echo test在标准输出上显示test。