OSDN Git Service

perf intel-pt: Remove first line of log dumped on error
authorAdrian Hunter <adrian.hunter@intel.com>
Mon, 5 Sep 2022 07:34:24 +0000 (10:34 +0300)
committerArnaldo Carvalho de Melo <acme@redhat.com>
Tue, 4 Oct 2022 11:55:21 +0000 (08:55 -0300)
Instead of printing "(first line may be sliced)", always remove the
first line of the debug log if the buffer has wrapped when dumping on
error.

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

index 24684ed..ef55d62 100644 (file)
@@ -143,16 +143,39 @@ static FILE *log_buf__open(struct log_buf *b, FILE *backend, unsigned int sz)
        return file;
 }
 
+static bool remove_first_line(const char **p, size_t *n)
+{
+       for (; *n && **p != '\n'; ++*p, --*n)
+               ;
+       if (*n) {
+               *p += 1;
+               *n -= 1;
+               return true;
+       }
+       return false;
+}
+
+static void write_lines(const char *p, size_t n, FILE *fp, bool *remove_first)
+{
+       if (*remove_first)
+               *remove_first = !remove_first_line(&p, &n);
+       fwrite(p, n, 1, fp);
+}
+
 static void log_buf__dump(struct log_buf *b)
 {
+       bool remove_first = false;
+
        if (!b->buf)
                return;
 
-       fflush(f);
-       fprintf(b->backend, "Dumping debug log buffer (first line may be sliced)\n");
-       if (b->wrapped)
-               fwrite(b->buf + b->head, b->buf_sz - b->head, 1, b->backend);
-       fwrite(b->buf, b->head, 1, b->backend);
+       fflush(f); /* Could update b->head and b->wrapped */
+       fprintf(b->backend, "Dumping debug log buffer\n");
+       if (b->wrapped) {
+               remove_first = true;
+               write_lines(b->buf + b->head, b->buf_sz - b->head, b->backend, &remove_first);
+       }
+       write_lines(b->buf, b->head, b->backend, &remove_first);
        fprintf(b->backend, "End of debug log buffer dump\n");
 
        b->head = 0;