diff options
Diffstat (limited to 'tools/perf/builtin-record.c')
-rw-r--r-- | tools/perf/builtin-record.c | 26 |
1 files changed, 21 insertions, 5 deletions
diff --git a/tools/perf/builtin-record.c b/tools/perf/builtin-record.c index 4ef78a5e6f32..0345aad8eba5 100644 --- a/tools/perf/builtin-record.c +++ b/tools/perf/builtin-record.c | |||
@@ -43,6 +43,7 @@ static int call_graph = 0; | |||
43 | static int verbose = 0; | 43 | static int verbose = 0; |
44 | static int inherit_stat = 0; | 44 | static int inherit_stat = 0; |
45 | static int no_samples = 0; | 45 | static int no_samples = 0; |
46 | static int sample_address = 0; | ||
46 | 47 | ||
47 | static long samples; | 48 | static long samples; |
48 | static struct timeval last_read; | 49 | static struct timeval last_read; |
@@ -313,6 +314,10 @@ static void pid_synthesize_mmap_samples(pid_t pid) | |||
313 | if (*pbf == 'x') { /* vm_exec */ | 314 | if (*pbf == 'x') { /* vm_exec */ |
314 | char *execname = strchr(bf, '/'); | 315 | char *execname = strchr(bf, '/'); |
315 | 316 | ||
317 | /* Catch VDSO */ | ||
318 | if (execname == NULL) | ||
319 | execname = strstr(bf, "[vdso]"); | ||
320 | |||
316 | if (execname == NULL) | 321 | if (execname == NULL) |
317 | continue; | 322 | continue; |
318 | 323 | ||
@@ -401,9 +406,13 @@ static void create_counter(int counter, int cpu, pid_t pid) | |||
401 | if (inherit_stat) | 406 | if (inherit_stat) |
402 | attr->inherit_stat = 1; | 407 | attr->inherit_stat = 1; |
403 | 408 | ||
409 | if (sample_address) | ||
410 | attr->sample_type |= PERF_SAMPLE_ADDR; | ||
411 | |||
404 | if (call_graph) | 412 | if (call_graph) |
405 | attr->sample_type |= PERF_SAMPLE_CALLCHAIN; | 413 | attr->sample_type |= PERF_SAMPLE_CALLCHAIN; |
406 | 414 | ||
415 | |||
407 | attr->mmap = track; | 416 | attr->mmap = track; |
408 | attr->comm = track; | 417 | attr->comm = track; |
409 | attr->inherit = (cpu < 0) && inherit; | 418 | attr->inherit = (cpu < 0) && inherit; |
@@ -516,10 +525,14 @@ static int __cmd_record(int argc, const char **argv) | |||
516 | signal(SIGCHLD, sig_handler); | 525 | signal(SIGCHLD, sig_handler); |
517 | signal(SIGINT, sig_handler); | 526 | signal(SIGINT, sig_handler); |
518 | 527 | ||
519 | if (!stat(output_name, &st) && !force && !append_file) { | 528 | if (!stat(output_name, &st) && st.st_size) { |
520 | fprintf(stderr, "Error, output file %s exists, use -A to append or -f to overwrite.\n", | 529 | if (!force && !append_file) { |
521 | output_name); | 530 | fprintf(stderr, "Error, output file %s exists, use -A to append or -f to overwrite.\n", |
522 | exit(-1); | 531 | output_name); |
532 | exit(-1); | ||
533 | } | ||
534 | } else { | ||
535 | append_file = 0; | ||
523 | } | 536 | } |
524 | 537 | ||
525 | flags = O_CREAT|O_RDWR; | 538 | flags = O_CREAT|O_RDWR; |
@@ -645,6 +658,8 @@ static const struct option options[] = { | |||
645 | "be more verbose (show counter open errors, etc)"), | 658 | "be more verbose (show counter open errors, etc)"), |
646 | OPT_BOOLEAN('s', "stat", &inherit_stat, | 659 | OPT_BOOLEAN('s', "stat", &inherit_stat, |
647 | "per thread counts"), | 660 | "per thread counts"), |
661 | OPT_BOOLEAN('d', "data", &sample_address, | ||
662 | "Sample addresses"), | ||
648 | OPT_BOOLEAN('n', "no-samples", &no_samples, | 663 | OPT_BOOLEAN('n', "no-samples", &no_samples, |
649 | "don't sample"), | 664 | "don't sample"), |
650 | OPT_END() | 665 | OPT_END() |
@@ -654,7 +669,8 @@ int cmd_record(int argc, const char **argv, const char *prefix __used) | |||
654 | { | 669 | { |
655 | int counter; | 670 | int counter; |
656 | 671 | ||
657 | argc = parse_options(argc, argv, options, record_usage, 0); | 672 | argc = parse_options(argc, argv, options, record_usage, |
673 | PARSE_OPT_STOP_AT_NON_OPTION); | ||
658 | if (!argc && target_pid == -1 && !system_wide) | 674 | if (!argc && target_pid == -1 && !system_wide) |
659 | usage_with_options(record_usage, options); | 675 | usage_with_options(record_usage, options); |
660 | 676 | ||