aboutsummaryrefslogtreecommitdiffstats
path: root/tools/perf/builtin-record.c
diff options
context:
space:
mode:
Diffstat (limited to 'tools/perf/builtin-record.c')
-rw-r--r--tools/perf/builtin-record.c26
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;
43static int verbose = 0; 43static int verbose = 0;
44static int inherit_stat = 0; 44static int inherit_stat = 0;
45static int no_samples = 0; 45static int no_samples = 0;
46static int sample_address = 0;
46 47
47static long samples; 48static long samples;
48static struct timeval last_read; 49static 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