Skip to content

Commit

Permalink
perf tools: Make stat/record print fatal signals of the target program
Browse files Browse the repository at this point in the history
When a program crashes under perf there is no message about it, unlike
when running it from bash. This can be confusing and lead to wrong
actions during debugging.

Print fatal signals in perf stat/record.

Thanks to Furat Afram for finding the problem originally

Link: http://lkml.kernel.org/r/1316122302-24306-1-git-send-email-andi@firstfloor.org
Cc: Frederic Weisbecker <fweisbec@gmail.com>
Cc: Stephane Eranian <eranian@google.com>
Signed-off-by: Andi Kleen <ak@linux.intel.com>
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
  • Loading branch information
Andi Kleen authored and Arnaldo Carvalho de Melo committed Sep 29, 2011
1 parent 61a9f32 commit 33e49ea
Show file tree
Hide file tree
Showing 2 changed files with 19 additions and 2 deletions.
19 changes: 17 additions & 2 deletions tools/perf/builtin-record.c
Original file line number Diff line number Diff line change
Expand Up @@ -73,6 +73,7 @@ static off_t post_processing_offset;

static struct perf_session *session;
static const char *cpu_list;
static const char *progname;

static void advance_output(size_t size)
{
Expand Down Expand Up @@ -137,17 +138,29 @@ static void mmap_read(struct perf_mmap *md)

static volatile int done = 0;
static volatile int signr = -1;
static volatile int child_finished = 0;

static void sig_handler(int sig)
{
if (sig == SIGCHLD)
child_finished = 1;

done = 1;
signr = sig;
}

static void sig_atexit(void)
{
if (child_pid > 0)
kill(child_pid, SIGTERM);
int status;

if (child_pid > 0) {
if (!child_finished)
kill(child_pid, SIGTERM);

wait(&status);
if (WIFSIGNALED(status))
psignal(WTERMSIG(status), progname);
}

if (signr == -1 || signr == SIGUSR1)
return;
Expand Down Expand Up @@ -445,6 +458,8 @@ static int __cmd_record(int argc, const char **argv)
char buf;
struct machine *machine;

progname = argv[0];

page_size = sysconf(_SC_PAGE_SIZE);

atexit(sig_atexit);
Expand Down
2 changes: 2 additions & 0 deletions tools/perf/builtin-stat.c
Original file line number Diff line number Diff line change
Expand Up @@ -495,6 +495,8 @@ static int run_perf_stat(int argc __used, const char **argv)
if (forks) {
close(go_pipe[1]);
wait(&status);
if (WIFSIGNALED(status))
psignal(WTERMSIG(status), argv[0]);
} else {
while(!done) sleep(1);
}
Expand Down

0 comments on commit 33e49ea

Please sign in to comment.