All of lore.kernel.org
 help / color / mirror / Atom feed
* [Qemu-devel] [RFC PATCH  0/3] Tweaks to linux-user -dfilter
@ 2018-08-09 17:55 Alex Bennée
  2018-08-09 17:55 ` [Qemu-devel] [RFC PATCH 1/3] util/log: allow -dfilter to stack Alex Bennée
                   ` (2 more replies)
  0 siblings, 3 replies; 5+ messages in thread
From: Alex Bennée @ 2018-08-09 17:55 UTC (permalink / raw)
  To: qemu-devel; +Cc: Alex Bennée

Hi,

While debugging a dynamically linked program I got frustrated having
to manually calculate the .text segment to avoid the logs getting
filled up with library stuff I wasn't really interested in. This
allows us to:

  - have multiple -dfilter lines for flexibility
  - specify -dfilter progtext as a shortcut

We could potentially extend this to handle -dfilter lib at a later
date.

Thoughts?

Alex Bennée (3):
  util/log: allow -dfilter to stack
  util/log: add qemu_dfilter_append_range()
  linux-user: add -dfilter progtext shortcut

 include/qemu/log.h   |  2 ++
 linux-user/main.c    | 16 +++++++++++++++-
 tests/test-logging.c | 14 ++++++++++++++
 util/log.c           | 29 +++++++++++++++++++++++------
 4 files changed, 54 insertions(+), 7 deletions(-)

-- 
2.17.1

^ permalink raw reply	[flat|nested] 5+ messages in thread

* [Qemu-devel] [RFC PATCH  1/3] util/log: allow -dfilter to stack
  2018-08-09 17:55 [Qemu-devel] [RFC PATCH 0/3] Tweaks to linux-user -dfilter Alex Bennée
@ 2018-08-09 17:55 ` Alex Bennée
  2018-08-09 17:55 ` [Qemu-devel] [RFC PATCH 2/3] util/log: add qemu_dfilter_append_range() Alex Bennée
  2018-08-09 17:55 ` [Qemu-devel] [RFC PATCH 3/3] linux-user: add -dfilter progtext shortcut Alex Bennée
  2 siblings, 0 replies; 5+ messages in thread
From: Alex Bennée @ 2018-08-09 17:55 UTC (permalink / raw)
  To: qemu-devel; +Cc: Alex Bennée

The original dfilter was patched to avoid a leak in the case of
multiple -dfilter ranges. There is no reason not to allow the user to
stack several dfilter options rather than push them all into one mega
line. We avoid the leak by simply only allocating the first time
around. As we are using a g_array it will automatically re-size as
needed.

The allocation is pushed to a helper as future patches will offer
additional ways to add to the dfilter.

We also add a helper qemu_reset_dfilter_ranges() so we can be explicit
in our unit tests.

Signed-off-by: Alex Bennée <alex.bennee@linaro.org>
---
 include/qemu/log.h   |  1 +
 tests/test-logging.c | 14 ++++++++++++++
 util/log.c           | 23 +++++++++++++++++------
 3 files changed, 32 insertions(+), 6 deletions(-)

diff --git a/include/qemu/log.h b/include/qemu/log.h
index b097a6cae1..8ed932ec24 100644
--- a/include/qemu/log.h
+++ b/include/qemu/log.h
@@ -116,6 +116,7 @@ void qemu_set_log(int log_flags);
 void qemu_log_needs_buffers(void);
 void qemu_set_log_filename(const char *filename, Error **errp);
 void qemu_set_dfilter_ranges(const char *ranges, Error **errp);
+void qemu_reset_dfilter_ranges(void);
 bool qemu_log_in_addr_range(uint64_t addr);
 int qemu_str_to_log_mask(const char *str);
 
diff --git a/tests/test-logging.c b/tests/test-logging.c
index a12585f70a..fbddd70ebc 100644
--- a/tests/test-logging.c
+++ b/tests/test-logging.c
@@ -43,6 +43,8 @@ static void test_parse_range(void)
     g_assert(qemu_log_in_addr_range(0x10ff));
     g_assert_false(qemu_log_in_addr_range(0x1100));
 
+    qemu_reset_dfilter_ranges();
+
     qemu_set_dfilter_ranges("0x1000-0x100", &error_abort);
 
     g_assert_false(qemu_log_in_addr_range(0x1001));
@@ -50,6 +52,8 @@ static void test_parse_range(void)
     g_assert(qemu_log_in_addr_range(0x0f01));
     g_assert_false(qemu_log_in_addr_range(0x0f00));
 
+    qemu_reset_dfilter_ranges();
+
     qemu_set_dfilter_ranges("0x1000..0x1100", &error_abort);
 
     g_assert_false(qemu_log_in_addr_range(0xfff));
@@ -57,26 +61,36 @@ static void test_parse_range(void)
     g_assert(qemu_log_in_addr_range(0x1100));
     g_assert_false(qemu_log_in_addr_range(0x1101));
 
+    qemu_reset_dfilter_ranges();
+
     qemu_set_dfilter_ranges("0x1000..0x1000", &error_abort);
 
     g_assert_false(qemu_log_in_addr_range(0xfff));
     g_assert(qemu_log_in_addr_range(0x1000));
     g_assert_false(qemu_log_in_addr_range(0x1001));
 
+    qemu_reset_dfilter_ranges();
+
     qemu_set_dfilter_ranges("0x1000+0x100,0x2100-0x100,0x3000..0x3100",
                             &error_abort);
     g_assert(qemu_log_in_addr_range(0x1050));
     g_assert(qemu_log_in_addr_range(0x2050));
     g_assert(qemu_log_in_addr_range(0x3050));
 
+    qemu_reset_dfilter_ranges();
+
     qemu_set_dfilter_ranges("0xffffffffffffffff-1", &error_abort);
     g_assert(qemu_log_in_addr_range(UINT64_MAX));
     g_assert_false(qemu_log_in_addr_range(UINT64_MAX - 1));
 
+    qemu_reset_dfilter_ranges();
+
     qemu_set_dfilter_ranges("0..0xffffffffffffffff", &err);
     g_assert(qemu_log_in_addr_range(0));
     g_assert(qemu_log_in_addr_range(UINT64_MAX));
  
+    qemu_reset_dfilter_ranges();
+
     qemu_set_dfilter_ranges("2..1", &err);
     error_free_or_abort(&err);
 
diff --git a/util/log.c b/util/log.c
index c0dbbd4700..c6c197cbb3 100644
--- a/util/log.c
+++ b/util/log.c
@@ -149,19 +149,30 @@ bool qemu_log_in_addr_range(uint64_t addr)
     }
 }
 
+static void maybe_allocate_dfilter(int size_hint)
+{
+    if (!debug_regions) {
+        debug_regions = g_array_sized_new(FALSE, FALSE,
+                                          sizeof(Range),
+                                          size_hint ? size_hint : 1);
+    }
+}
+
+/* This is only really used for testing, usually dfilter stacks */
+void qemu_reset_dfilter_ranges(void)
+{
+    GArray *old = debug_regions;
+    debug_regions = NULL;
+    g_array_free(old, TRUE);
+}
 
 void qemu_set_dfilter_ranges(const char *filter_spec, Error **errp)
 {
     gchar **ranges = g_strsplit(filter_spec, ",", 0);
     int i;
 
-    if (debug_regions) {
-        g_array_unref(debug_regions);
-        debug_regions = NULL;
-    }
+    maybe_allocate_dfilter(g_strv_length(ranges));
 
-    debug_regions = g_array_sized_new(FALSE, FALSE,
-                                      sizeof(Range), g_strv_length(ranges));
     for (i = 0; ranges[i]; i++) {
         const char *r = ranges[i];
         const char *range_op, *r2, *e;
-- 
2.17.1

^ permalink raw reply related	[flat|nested] 5+ messages in thread

* [Qemu-devel] [RFC PATCH 2/3] util/log: add qemu_dfilter_append_range()
  2018-08-09 17:55 [Qemu-devel] [RFC PATCH 0/3] Tweaks to linux-user -dfilter Alex Bennée
  2018-08-09 17:55 ` [Qemu-devel] [RFC PATCH 1/3] util/log: allow -dfilter to stack Alex Bennée
@ 2018-08-09 17:55 ` Alex Bennée
  2018-08-09 17:55 ` [Qemu-devel] [RFC PATCH 3/3] linux-user: add -dfilter progtext shortcut Alex Bennée
  2 siblings, 0 replies; 5+ messages in thread
From: Alex Bennée @ 2018-08-09 17:55 UTC (permalink / raw)
  To: qemu-devel; +Cc: Alex Bennée

This allows us to add to the dfilter range as we go.

Signed-off-by: Alex Bennée <alex.bennee@linaro.org>
---
 include/qemu/log.h | 1 +
 util/log.c         | 6 ++++++
 2 files changed, 7 insertions(+)

diff --git a/include/qemu/log.h b/include/qemu/log.h
index 8ed932ec24..f915b5bd91 100644
--- a/include/qemu/log.h
+++ b/include/qemu/log.h
@@ -117,6 +117,7 @@ void qemu_log_needs_buffers(void);
 void qemu_set_log_filename(const char *filename, Error **errp);
 void qemu_set_dfilter_ranges(const char *ranges, Error **errp);
 void qemu_reset_dfilter_ranges(void);
+void qemu_append_dfilter_range(Range r, Error **errp);
 bool qemu_log_in_addr_range(uint64_t addr);
 int qemu_str_to_log_mask(const char *str);
 
diff --git a/util/log.c b/util/log.c
index c6c197cbb3..cc79a146d1 100644
--- a/util/log.c
+++ b/util/log.c
@@ -233,6 +233,12 @@ out:
     g_strfreev(ranges);
 }
 
+void qemu_append_dfilter_range(Range r, Error **errp)
+{
+    maybe_allocate_dfilter(1);
+    g_array_append_val(debug_regions, r);
+}
+
 /* fflush() the log file */
 void qemu_log_flush(void)
 {
-- 
2.17.1

^ permalink raw reply related	[flat|nested] 5+ messages in thread

* [Qemu-devel] [RFC PATCH 3/3] linux-user: add -dfilter progtext shortcut
  2018-08-09 17:55 [Qemu-devel] [RFC PATCH 0/3] Tweaks to linux-user -dfilter Alex Bennée
  2018-08-09 17:55 ` [Qemu-devel] [RFC PATCH 1/3] util/log: allow -dfilter to stack Alex Bennée
  2018-08-09 17:55 ` [Qemu-devel] [RFC PATCH 2/3] util/log: add qemu_dfilter_append_range() Alex Bennée
@ 2018-08-09 17:55 ` Alex Bennée
  2018-08-14 19:32   ` Laurent Vivier
  2 siblings, 1 reply; 5+ messages in thread
From: Alex Bennée @ 2018-08-09 17:55 UTC (permalink / raw)
  To: qemu-devel; +Cc: Alex Bennée, Riku Voipio, Laurent Vivier

When debugging you often don't care about the libraries but just the
code in the testcase. Rather than make the user build this by hand
offer a shortcut.

Signed-off-by: Alex Bennée <alex.bennee@linaro.org>
---
 linux-user/main.c | 16 +++++++++++++++-
 1 file changed, 15 insertions(+), 1 deletion(-)

diff --git a/linux-user/main.c b/linux-user/main.c
index ea00dd9057..8d4427727e 100644
--- a/linux-user/main.c
+++ b/linux-user/main.c
@@ -28,6 +28,7 @@
 #include "qemu/config-file.h"
 #include "qemu/cutils.h"
 #include "qemu/help_option.h"
+#include "qemu/range.h"
 #include "cpu.h"
 #include "exec/exec-all.h"
 #include "tcg.h"
@@ -51,6 +52,8 @@ unsigned long mmap_min_addr;
 unsigned long guest_base;
 int have_guest_base;
 
+static bool dfilter_progtext;
+
 /*
  * When running 32-on-64 we should make sure we can fit all of the possible
  * guest address space into a contiguous chunk of virtual host memory.
@@ -222,6 +225,11 @@ static void handle_arg_log(const char *arg)
 
 static void handle_arg_dfilter(const char *arg)
 {
+    if (strcmp(arg, "progtext") == 0) {
+        dfilter_progtext = true;
+        return;
+    }
+
     qemu_set_dfilter_ranges(arg, NULL);
 }
 
@@ -423,7 +431,7 @@ static const struct qemu_argument arg_table[] = {
      "item[,...]", "enable logging of specified items "
      "(use '-d help' for a list of items)"},
     {"dfilter",    "QEMU_DFILTER",     true,  handle_arg_dfilter,
-     "range[,...]","filter logging based on address range"},
+     "range|progtext[,...]", "filter logging based on address range"},
     {"D",          "QEMU_LOG_FILENAME", true, handle_arg_log_filename,
      "logfile",     "write logs to 'logfile' (default stderr)"},
     {"p",          "QEMU_PAGESIZE",    true,  handle_arg_pagesize,
@@ -796,6 +804,12 @@ int main(int argc, char **argv, char **envp)
         qemu_log("auxv_start  0x" TARGET_ABI_FMT_lx "\n", info->saved_auxv);
     }
 
+    if (dfilter_progtext) {
+        Range r;
+        range_set_bounds(&r, info->start_code, info->end_code);
+        qemu_append_dfilter_range(r, NULL);
+    }
+
     target_set_brk(info->brk);
     syscall_init();
     signal_init();
-- 
2.17.1

^ permalink raw reply related	[flat|nested] 5+ messages in thread

* Re: [Qemu-devel] [RFC PATCH 3/3] linux-user: add -dfilter progtext shortcut
  2018-08-09 17:55 ` [Qemu-devel] [RFC PATCH 3/3] linux-user: add -dfilter progtext shortcut Alex Bennée
@ 2018-08-14 19:32   ` Laurent Vivier
  0 siblings, 0 replies; 5+ messages in thread
From: Laurent Vivier @ 2018-08-14 19:32 UTC (permalink / raw)
  To: Alex Bennée, qemu-devel; +Cc: Riku Voipio

Le 09/08/2018 à 19:55, Alex Bennée a écrit :
> When debugging you often don't care about the libraries but just the
> code in the testcase. Rather than make the user build this by hand
> offer a shortcut.
> 
> Signed-off-by: Alex Bennée <alex.bennee@linaro.org>
> ---
>  linux-user/main.c | 16 +++++++++++++++-
>  1 file changed, 15 insertions(+), 1 deletion(-)
> 
> diff --git a/linux-user/main.c b/linux-user/main.c
> index ea00dd9057..8d4427727e 100644
> --- a/linux-user/main.c
> +++ b/linux-user/main.c
> @@ -28,6 +28,7 @@
>  #include "qemu/config-file.h"
>  #include "qemu/cutils.h"
>  #include "qemu/help_option.h"
> +#include "qemu/range.h"
>  #include "cpu.h"
>  #include "exec/exec-all.h"
>  #include "tcg.h"
> @@ -51,6 +52,8 @@ unsigned long mmap_min_addr;
>  unsigned long guest_base;
>  int have_guest_base;
>  
> +static bool dfilter_progtext;
> +
>  /*
>   * When running 32-on-64 we should make sure we can fit all of the possible
>   * guest address space into a contiguous chunk of virtual host memory.
> @@ -222,6 +225,11 @@ static void handle_arg_log(const char *arg)
>  
>  static void handle_arg_dfilter(const char *arg)
>  {
> +    if (strcmp(arg, "progtext") == 0) {
> +        dfilter_progtext = true;
> +        return;
> +    }
> +
>      qemu_set_dfilter_ranges(arg, NULL);
>  }
>  
> @@ -423,7 +431,7 @@ static const struct qemu_argument arg_table[] = {
>       "item[,...]", "enable logging of specified items "
>       "(use '-d help' for a list of items)"},
>      {"dfilter",    "QEMU_DFILTER",     true,  handle_arg_dfilter,
> -     "range[,...]","filter logging based on address range"},
> +     "range|progtext[,...]", "filter logging based on address range"},
>      {"D",          "QEMU_LOG_FILENAME", true, handle_arg_log_filename,
>       "logfile",     "write logs to 'logfile' (default stderr)"},
>      {"p",          "QEMU_PAGESIZE",    true,  handle_arg_pagesize,
> @@ -796,6 +804,12 @@ int main(int argc, char **argv, char **envp)
>          qemu_log("auxv_start  0x" TARGET_ABI_FMT_lx "\n", info->saved_auxv);
>      }
>  
> +    if (dfilter_progtext) {
> +        Range r;
> +        range_set_bounds(&r, info->start_code, info->end_code);
> +        qemu_append_dfilter_range(r, NULL);
> +    }
> +
>      target_set_brk(info->brk);
>      syscall_init();
>      signal_init();
> 

Reviewed-by: Laurent Vivier <laurent@vivier.eu>

^ permalink raw reply	[flat|nested] 5+ messages in thread

end of thread, other threads:[~2018-08-14 19:34 UTC | newest]

Thread overview: 5+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2018-08-09 17:55 [Qemu-devel] [RFC PATCH 0/3] Tweaks to linux-user -dfilter Alex Bennée
2018-08-09 17:55 ` [Qemu-devel] [RFC PATCH 1/3] util/log: allow -dfilter to stack Alex Bennée
2018-08-09 17:55 ` [Qemu-devel] [RFC PATCH 2/3] util/log: add qemu_dfilter_append_range() Alex Bennée
2018-08-09 17:55 ` [Qemu-devel] [RFC PATCH 3/3] linux-user: add -dfilter progtext shortcut Alex Bennée
2018-08-14 19:32   ` Laurent Vivier

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.