簡體   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