aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--tools/perf/builtin-probe.c64
-rw-r--r--tools/perf/util/probe-finder.c6
2 files changed, 40 insertions, 30 deletions
diff --git a/tools/perf/builtin-probe.c b/tools/perf/builtin-probe.c
index 65bcaed0ef49..d111a93f2209 100644
--- a/tools/perf/builtin-probe.c
+++ b/tools/perf/builtin-probe.c
@@ -189,7 +189,7 @@ static void parse_probe_event(const char *str)
189 /* Parse probe point */ 189 /* Parse probe point */
190 parse_probe_point(argv[0], pp); 190 parse_probe_point(argv[0], pp);
191 free(argv[0]); 191 free(argv[0]);
192 if (pp->file) 192 if (pp->file || pp->line)
193 session.need_dwarf = 1; 193 session.need_dwarf = 1;
194 194
195 /* Copy arguments */ 195 /* Copy arguments */
@@ -347,36 +347,24 @@ int cmd_probe(int argc, const char **argv, const char *prefix __used)
347 if (session.nr_probe == 0) 347 if (session.nr_probe == 0)
348 usage_with_options(probe_usage, options); 348 usage_with_options(probe_usage, options);
349 349
350#ifdef NO_LIBDWARF
351 if (session.need_dwarf) 350 if (session.need_dwarf)
352 semantic_error("Dwarf-analysis is not supported"); 351#ifdef NO_LIBDWARF
353#endif 352 semantic_error("Debuginfo-analysis is not supported");
354 353#else /* !NO_LIBDWARF */
355 /* Synthesize probes without dwarf */ 354 pr_info("Some probes require debuginfo.\n");
356 for (j = 0; j < session.nr_probe; j++) {
357#ifndef NO_LIBDWARF
358 if (!session.probes[j].retprobe) {
359 session.need_dwarf = 1;
360 continue;
361 }
362#endif
363 ret = synthesize_probe_event(&session.probes[j]);
364 if (ret == -E2BIG)
365 semantic_error("probe point is too long.");
366 else if (ret < 0)
367 die("Failed to synthesize a probe point.");
368 }
369
370#ifndef NO_LIBDWARF
371 if (!session.need_dwarf)
372 goto setup_probes;
373 355
374 if (session.vmlinux) 356 if (session.vmlinux)
375 fd = open(session.vmlinux, O_RDONLY); 357 fd = open(session.vmlinux, O_RDONLY);
376 else 358 else
377 fd = open_default_vmlinux(); 359 fd = open_default_vmlinux();
378 if (fd < 0) 360 if (fd < 0) {
379 die("Could not open vmlinux/module file."); 361 if (session.need_dwarf)
362 die("Could not open vmlinux/module file.");
363
364 pr_warning("Could not open vmlinux/module file."
365 " Try to use symbols.\n");
366 goto end_dwarf;
367 }
380 368
381 /* Searching probe points */ 369 /* Searching probe points */
382 for (j = 0; j < session.nr_probe; j++) { 370 for (j = 0; j < session.nr_probe; j++) {
@@ -386,14 +374,34 @@ int cmd_probe(int argc, const char **argv, const char *prefix __used)
386 374
387 lseek(fd, SEEK_SET, 0); 375 lseek(fd, SEEK_SET, 0);
388 ret = find_probepoint(fd, pp); 376 ret = find_probepoint(fd, pp);
389 if (ret <= 0) 377 if (ret < 0) {
390 die("No probe point found.\n"); 378 if (session.need_dwarf)
379 die("Could not analyze debuginfo.");
380
381 pr_warning("An error occurred in debuginfo analysis. Try to use symbols.\n");
382 break;
383 }
384 if (ret == 0) /* No error but failed to find probe point. */
385 die("No probe point found.");
391 } 386 }
392 close(fd); 387 close(fd);
393 388
394setup_probes: 389end_dwarf:
395#endif /* !NO_LIBDWARF */ 390#endif /* !NO_LIBDWARF */
396 391
392 /* Synthesize probes without dwarf */
393 for (j = 0; j < session.nr_probe; j++) {
394 pp = &session.probes[j];
395 if (pp->found) /* This probe is already found. */
396 continue;
397
398 ret = synthesize_probe_event(pp);
399 if (ret == -E2BIG)
400 semantic_error("probe point is too long.");
401 else if (ret < 0)
402 die("Failed to synthesize a probe point.");
403 }
404
397 /* Settng up probe points */ 405 /* Settng up probe points */
398 snprintf(buf, MAX_CMDLEN, "%s/../kprobe_events", debugfs_path); 406 snprintf(buf, MAX_CMDLEN, "%s/../kprobe_events", debugfs_path);
399 fd = open(buf, O_WRONLY, O_APPEND); 407 fd = open(buf, O_WRONLY, O_APPEND);
diff --git a/tools/perf/util/probe-finder.c b/tools/perf/util/probe-finder.c
index 35d5a69aaf9b..293cdfc1b8ca 100644
--- a/tools/perf/util/probe-finder.c
+++ b/tools/perf/util/probe-finder.c
@@ -687,8 +687,10 @@ int find_probepoint(int fd, struct probe_point *pp)
687 struct probe_finder pf = {.pp = pp}; 687 struct probe_finder pf = {.pp = pp};
688 688
689 ret = dwarf_init(fd, DW_DLC_READ, 0, 0, &__dw_debug, &__dw_error); 689 ret = dwarf_init(fd, DW_DLC_READ, 0, 0, &__dw_debug, &__dw_error);
690 if (ret != DW_DLV_OK) 690 if (ret != DW_DLV_OK) {
691 die("No dwarf info found in the vmlinux - please rebuild with CONFIG_DEBUG_INFO.\n"); 691 pr_warning("No dwarf info found in the vmlinux - please rebuild with CONFIG_DEBUG_INFO.\n");
692 return -ENOENT;
693 }
692 694
693 pp->found = 0; 695 pp->found = 0;
694 while (++cu_number) { 696 while (++cu_number) {