Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/vue.js/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
防止valgrind跟踪使用execvp创建的任何java子进程_Java_C_Valgrind_Execvp_Memcheck - Fatal编程技术网

防止valgrind跟踪使用execvp创建的任何java子进程

防止valgrind跟踪使用execvp创建的任何java子进程,java,c,valgrind,execvp,memcheck,Java,C,Valgrind,Execvp,Memcheck,我有一个C程序,在这个程序中我对java进行execvp调用,如下所示: execvp(path_to_java, args); 其中path\u to_java=“/usr/java/latest/jre/bin/java”和args包含指向我正在运行的jar的链接。我知道它正在工作-我只想分析C部分 我试图使用此命令对其运行memcheck,以避免分析java子进程,同时分析所有其他子进程: valgrind --leak-check=yes --trace-children=yes --

我有一个C程序,在这个程序中我对
java
进行
execvp
调用,如下所示:

execvp(path_to_java, args);
其中
path\u to_java=“/usr/java/latest/jre/bin/java”
args
包含指向我正在运行的
jar
的链接。我知道它正在工作-我只想分析C部分

我试图使用此命令对其运行memcheck,以避免分析
java
子进程,同时分析所有其他子进程:

valgrind --leak-check=yes --trace-children=yes --trace-children-skip=*java* myprog >>& LOGFILE
但是,在其他问题中,我在
日志文件中看到了以下问题:

valgrind: No match.
我也尝试了
--trace children skip=java
,这并没有导致“不匹配”错误,但它完全无法阻止
valgrind
进入
java
子流程

我这样做的原因是我不想分析
java
子流程,特别是因为
valgrind
和JVM的性能不好。例如:

==4873== 32,744 bytes in 1 blocks are possibly lost in loss record 946 of 986
==4873==    at 0x4A069EE: malloc (vg_replace_malloc.c:270)
==4873==    by 0x5A455E8: os::malloc(unsigned long, unsigned short, unsigned cha
r*) (in /usr/java/jdk1.7.0_45/jre/lib/amd64/server/libjvm.so)
==4873==    by 0x54D7D32: ChunkPool::allocate(unsigned long, AllocFailStrategy::
AllocFailEnum) (in /usr/java/jdk1.7.0_45/jre/lib/amd64/server/libjvm.so)
==4873==    by 0x54D7950: Arena::grow(unsigned long, AllocFailStrategy::AllocFai
lEnum) (in /usr/java/jdk1.7.0_45/jre/lib/amd64/server/libjvm.so)
==4873==    by 0x56BDCFE: constMethodKlass::allocate(int, int, int, int, int, bo
ol, Thread*) (in /usr/java/jdk1.7.0_45/jre/lib/amd64/server/libjvm.so)
==4873==    by 0x5A3EDF9: oopFactory::new_method(int, AccessFlags, int, int, int
, int, bool, Thread*) (in /usr/java/jdk1.7.0_45/jre/lib/amd64/server/libjvm.so)
==4873==    by 0x563BD38: ClassFileParser::parse_method(constantPoolHandle, bool
, AccessFlags*, typeArrayHandle*, typeArrayHandle*, typeArrayHandle*, Thread*) (
in /usr/java/jdk1.7.0_45/jre/lib/amd64/server/libjvm.so)
==4873==    by 0x563C81B: ClassFileParser::parse_methods(constantPoolHandle, bool, AccessFlags*, bool*, objArrayOopDesc**, objArrayOopDesc**, objArrayOopDesc**, Thread*) (in /usr/java/jdk1.7.0_45/jre/lib/amd64/server/libjvm.so)
==4873==    by 0x563F8B0: ClassFileParser::parseClassFile(Symbol*, Handle, Handle, KlassHandle, GrowableArray<Handle>*, TempNewSymbol&, bool, Thread*) (in /usr/java/jdk1.7.0_45/jre/lib/amd64/server/libjvm.so)
==4873==    by 0x5643BF2: ClassLoader::load_classfile(Symbol*, Thread*) (in /usr/java/jdk1.7.0_45/jre/lib/amd64/server/libjvm.so)
==4873==    by 0x5B4FC86: SystemDictionary::load_instance_class(Symbol*, Handle, Thread*) (in /usr/java/jdk1.7.0_45/jre/lib/amd64/server/libjvm.so)
==4873==    by 0x5B50490: SystemDictionary::resolve_instance_class_or_null(Symbol*, Handle, Handle, Thread*) (in /usr/java/jdk1.7.0_45/jre/lib/amd64/server/libjvm.so)
==4873==32744字节在986的丢失记录946中可能丢失
==4873==at 0x4A069EE:malloc(vg_替换_malloc.c:270)
==4873==by 0x5A455E8:os::malloc(无符号长、无符号短、无符号长)
r*)(在/usr/java/jdk1.7.0_45/jre/lib/amd64/server/libjvm.so中)
==4873==by 0x54D7D32:ChunkPool::allocate(无符号长,AllocFailStrategy::
AllocFailEnum)(在/usr/java/jdk1.7.0_45/jre/lib/amd64/server/libjvm.so中)
==4873==0x54D7950:Arena::grow(无符号长,AllocFailStrategy::AllocFai
lEnum)(在/usr/java/jdk1.7.0_45/jre/lib/amd64/server/libjvm.so中)
==4873==by 0x56BDCFE:constMethodKlass::allocate(int,int,int,int,int,bo
(在/usr/java/jdk1.7.0_45/jre/lib/amd64/server/libjvm.so中)
==4873==by 0x5A3EDF9:oopFactory::new_方法(int,AccessFlags,int,int,int,int
,int,bool,Thread*)(in/usr/java/jdk1.7.0_45/jre/lib/amd64/server/libjvm.so)
==4873==by 0x563BD38:ClassFileParser::parse_方法(constantPoolHandle,bool
,AccessFlags*,typeArrayHandle*,typeArrayHandle*,typeArrayHandle*,Thread*)(
在/usr/java/jdk1.7.0_45/jre/lib/amd64/server/libjvm.so中)
==4873==by 0x563C81B:ClassFileParser::parse_方法(constantPoolHandle,bool,AccessFlags*,bool*,objArrayOopDesc**,objArrayOopDesc**,objArrayOopDesc**,Thread*)(在/usr/java/jd1.7.0_45/jre/lib/amd64/server/libjvm.so中)
==4873==by 0x563F8B0:ClassFileParser::parseClassFile(Symbol*,Handle,Handle,KlassHandle,growtableArray*,TempNewSymbol&,bool,Thread*)(in/usr/java/jdk1.7.045/jre/lib/amd64/server/libjvm.so)
==4873==by 0x5643BF2:ClassLoader::load_类文件(符号*,线程*)(在/usr/java/jdk1.7.0_45/jre/lib/amd64/server/libjvm.so中)
==4873==by 0x5B4FC86:SystemDictionary::load_instance_class(符号*,句柄,线程*)(在/usr/java/jdk1.7.0_45/jre/lib/amd64/server/libjvm.so中)
==4873==by 0x5B50490:SystemDictionary::resolve_instance_class_或_null(符号*,句柄,句柄,线程*)(在/usr/java/jdk1.7.0_45/jre/lib/amd64/server/libjvm.so中)

哎哟。我做错了什么?

您是否在命令行中将
*java*
模式置于引号中?像这样:

valgrind--leak check=yes--trace children=yes--trace children skip=“*java*”myprog>>&LOGFILE


否则,shell将解释星号,这将导致出现
valgrind:No match.
消息。

这可能是一个愚蠢的问题,但是如果您不需要跟踪任何子对象,那么省略
--trace children
参数(或者
--trace children=No
,如果这不是默认值)怎么样?@AndrewMedico我不想跟踪任何
java
子进程。我还有其他几个子进程,它们不是我想要跟踪的
java
的调用:)可能还有另一个愚蠢的问题:您是
exec*()
直接从主进程调用其他子进程,还是由java进程启动?手册警告说,不会追踪被跳过孩子的孩子。@AndrewMedico我是从主流程开始做的,所以不用担心。谢谢,这是一个很大的疏忽。现在一切都很顺利。