繁体   English   中英

如何确定valgrind / callgrind为什么杀死进程

[英]How to determine why valgrind/callgrind kills process

我为正在使用的数据库基础结构编写了多线程压力测试,并且尝试使用callgrind对其进行概要分析。 该程序在valgrind之外可以完美执行,并提供预期的结果。

但是,在valgrind --tool=callgrind下运行该程序时,该程序将执行一小段时间,然后停止运行,并且valgrind将Killed作为最后一个输出报告给stdout。

我有办法确定valgrind为什么杀死我的任务吗?


在遵循phd的建议之后:它确实被valgrind --tool=none杀死了,但是,我不确定如何分析给出的消息,我的线程中似乎有很多sigvgkill信号。 这是这里的第一个实例:

--13713:1:syswrap- run_a_thread_NORETURN(tid=104): pre-thread_wrapper
 --> [pre-success] Success(0x0:0x365c)--13713:1:syswrap- thread_wrapper(tid=104): entry
 SYSCALL[13713,104](311) sys_set_robust_list ( 0x4f213be0, 12 )[sync] --> Success(0x0:0x0)
SYSCALL[13713,104](240) sys_futex ( 0xbeaf348, 128, 2, 0x0, 0x0 ) --> [async] ...
--13713-- async signal handler: signal=13, tid=32, si_code=0
--13713-- interrupted_syscall: tid=32, ip=0x380b197c, restart=False, sres.isErr=True, sres.val=32
--13713--   completed, but uncommitted: committing
--13713:1:gdbsrv   VG core calling VG_(gdbserver_report_signal) vki_nr 13 SIGPIPE gdb_nr 13 SIGPIPE tid 32
--13713:1:gdbsrv   not connected => pass
--13713-- delivering signal 13 (SIGPIPE):0 to thread 32
--13713-- delivering 13 (code 0) to default handler; action: terminate
==13713==

据我所知,valgrind不会以“ killed”这样的冗长语气杀死程序。 这样的事情看起来更像是另一个过程的杀手。

尽管如此,您可以尝试几种方法来调查为什么您的程序在valgrind下而不是在本机上的行为不同:

  1. 首先在valgrind --tool=none下运行它。 这是更快的工具(不执行任何操作)。 然后,您可以查看程序是否按预期运行。 如果不是,则使用附加的valgrind内部跟踪运行,例如

     --tool=none -v -v -v -d -d -d --trace-syscalls=yes --trace-signals=yes 

    跟踪可能会提供线索,说明为什么它中止/被杀死。

  2. --tool=memcheck--tool=helgrind下运行它(同样,如果崩溃,则可以进行更多跟踪)。

  3. 最后,如果上述内容尚未弄清,则--tool=callgrind +更多跟踪。

这是一个古老的问题-但是发生的是,您正在接收SIGPIPE(断开的管道-写入对另一端无任何监听的管道)信号。

Valgrind注意到了这一点(“嘿,我看到的是一个SIGPIPE专门用于您的程序”),并继续将其交付给您的程序(毕竟这是针对它的)。

由于您可能未指定收到SIGPIPE时应发生的情况,因此将执行默认操作,即终止程序。 请参阅为什么存在SIGPIPE? 请记住,Valgrind下的程序运行速度要慢得多,所以行为(“在Valgrind下工作,否则无法正常工作”,反之亦然)可能会因时机而异。

如果您希望在常规使用期间使用SIGPIPE并希望忽略它(这样它就不会杀死您的程序),请调用

#include <signal.h>
// ...
signal(SIGPIPE, SIG_IGN); // ignore broken pipe signal 

您可能希望对可能期望的其他信号执行相同的操作,否则这将对您的过程造成致命危害(SIGHUP,...)。

综上所述,Valgrind并没有杀死您的进程,而是给了您有关进程为何死的提示。 在极少数情况下,我看到Valgrind杀死了我的进程(这当然是我自己的错)-通常不会。 即使您读/写您不拥有的内存地址,Valgrind也不会终止您的进程。 肯定会抱怨,但是它将执行指令,而实际上杀死您的进程的是SIGSEGV,它是在您尝试读/写内存之后立即出现的。

这是Valgrind终止您的进程时的样子: Valgrind必须终止您的过程时的屏幕截图。

这种情况很少发生,我实际上对其进行了截图。 ;)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM