perf intel-pt: Add some more logging to intel_pt_walk_next_insn()
authorAdrian Hunter <adrian.hunter@intel.com>
Mon, 11 Jul 2022 09:32:12 +0000 (12:32 +0300)
committerArnaldo Carvalho de Melo <acme@redhat.com>
Wed, 20 Jul 2022 14:08:46 +0000 (11:08 -0300)
To aid debugging, add some more logging to intel_pt_walk_next_insn().

Signed-off-by: Adrian Hunter <adrian.hunter@intel.com>
Acked-by: Ian Rogers <irogers@google.com>
Cc: Andi Kleen <ak@linux.intel.com>
Cc: Jiri Olsa <jolsa@kernel.org>
Cc: Namhyung Kim <namhyung@kernel.org>
Cc: kvm@vger.kernel.org
Link: https://lore.kernel.org/r/20220711093218.10967-30-adrian.hunter@intel.com
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
tools/perf/util/intel-pt.c

index 014f9f73cc49f5c7fd67b91580bffc6044236bc0..a8798b5bb3112ab84e02a4e5df0e441d1b0a0756 100644 (file)
@@ -758,27 +758,38 @@ static int intel_pt_walk_next_insn(struct intel_pt_insn *intel_pt_insn,
 
        if (nr) {
                if ((!symbol_conf.guest_code && cpumode != PERF_RECORD_MISC_GUEST_KERNEL) ||
-                   intel_pt_get_guest(ptq))
+                   intel_pt_get_guest(ptq)) {
+                       intel_pt_log("ERROR: no guest machine\n");
                        return -EINVAL;
+               }
                machine = ptq->guest_machine;
                thread = ptq->guest_thread;
                if (!thread) {
-                       if (cpumode != PERF_RECORD_MISC_GUEST_KERNEL)
+                       if (cpumode != PERF_RECORD_MISC_GUEST_KERNEL) {
+                               intel_pt_log("ERROR: no guest thread\n");
                                return -EINVAL;
+                       }
                        thread = ptq->unknown_guest_thread;
                }
        } else {
                thread = ptq->thread;
                if (!thread) {
-                       if (cpumode != PERF_RECORD_MISC_KERNEL)
+                       if (cpumode != PERF_RECORD_MISC_KERNEL) {
+                               intel_pt_log("ERROR: no thread\n");
                                return -EINVAL;
+                       }
                        thread = ptq->pt->unknown_thread;
                }
        }
 
        while (1) {
-               if (!thread__find_map(thread, cpumode, *ip, &al) || !al.map->dso)
+               if (!thread__find_map(thread, cpumode, *ip, &al) || !al.map->dso) {
+                       if (al.map)
+                               intel_pt_log("ERROR: thread has no dso for %#" PRIx64 "\n", *ip);
+                       else
+                               intel_pt_log("ERROR: thread has no map for %#" PRIx64 "\n", *ip);
                        return -EINVAL;
+               }
 
                if (al.map->dso->data.status == DSO_DATA_STATUS_ERROR &&
                    dso__data_status_seen(al.map->dso,
@@ -819,8 +830,12 @@ static int intel_pt_walk_next_insn(struct intel_pt_insn *intel_pt_insn,
                        len = dso__data_read_offset(al.map->dso, machine,
                                                    offset, buf,
                                                    INTEL_PT_INSN_BUF_SZ);
-                       if (len <= 0)
+                       if (len <= 0) {
+                               intel_pt_log("ERROR: failed to read at %" PRIu64 " ", offset);
+                               if (intel_pt_enable_logging)
+                                       dso__fprintf(al.map->dso, intel_pt_log_fp());
                                return -EINVAL;
+                       }
 
                        if (intel_pt_get_insn(buf, len, x86_64, intel_pt_insn))
                                return -EINVAL;