当我运行我的程序或者当我用gdb运行它似乎运行正常,没有错误,我得到一个预期的输出。
但是当我用valgrind通过valgrind ./program
运行它时,它甚至不会太远。 我收到一个VALGRIND INTERNAL ERROR: Valgrind received a signal 11 (SIGSEGV)
– 在开始时退出。 valgrind输出完全不能帮助我。 我调用了一个subprocess,但valgrind并不遵循它。 我试图使用--trace-children=yes
选项,但没有改变。
另一个问题:调用valgrind program
和valgrind ./program
valgrind program
什么区别?
我得到的输出是:
$ valgrind --tool=memcheck --trace-children=yes ./program ==2616== Memcheck, a memory error detector ==2616== Copyright (C) 2002-2010, and GNU GPL'd, by Julian Seward et al. ==2616== Using Valgrind-3.6.1 and LibVEX; rerun with -h for copyright info ==2616== Command: ./program ==2616== Parent pid is 2616 Child pid is 2619 main() could not create fifo --2619-- VALGRIND INTERNAL ERROR: Valgrind received a signal 11 (SIGSEGV) - exiting --2619-- si_code=2; Faulting address: 0x400DFD; sp: 0x403277b70 valgrind: the 'impossible' happened: Killed by fatal signal ==2619== at 0x3802D33A: mash_colon_env (m_libcproc.c:195) ==2619== by 0x3802D6FD: vgPlain_env_remove_valgrind_env_stuff (m_libcproc.c:254) ==2619== by 0x3806EB7C: vgSysWrap_generic_sys_execve_before (syswrap-generic.c:2622) ==2619== by 0x38068750: vgPlain_client_syscall (syswrap-main.c:1443) ==2619== by 0x380651E9: handle_syscall (scheduler.c:895) ==2619== by 0x38066D6A: vgPlain_scheduler (scheduler.c:1091) ==2619== by 0x380763FC: run_a_thread_NORETURN (syswrap-linux.c:94) sched status: running_tid=1 Thread 1: status = VgTs_Runnable ==2619== at 0x567D957: execve (execve.c:60) ==2619== by 0x567E1E8: execvpe (execvpe.c:151) ==2619== by 0x400B2D: main (program2.cpp:34)
提前致谢。
那个错误表明你最有可能遇到了valgrind中的一个bug。 事实上,它已经被报告( https://bugs.kde.org/show_bug.cgi?id=271582 ),所以你应该加入自己的错误,以保持最新的修复工作。
通常,应在https://bugs.kde.org/enter_valgrind_bug.cgi报告这种“VALGRIND INTERNAL ERROR”消息,确保在程序中包含运行valgrind -v
的完整输出。
你应该使用Valgrind“follow-fork-mode”子。 这就是为什么Valgrind可能不会遵循你的子进程。