From 62ffe734b0cbb733ca2c4a90282e4d70ae49acfe Mon Sep 17 00:00:00 2001 From: Soren Sandmann Date: Sat, 29 Mar 2008 19:08:01 +0000 Subject: [PATCH] Call back after collecting all traces. 2008-03-24 Soren Sandmann * collector.c (collect_traces): Call back after collecting all traces. * TODO: update * process.c: Simpler code to find vmlinux svn path=/trunk/; revision=406 --- ChangeLog | 9 +++++++++ TODO | 16 ++++++++++++++++ collector.c | 10 +++++++--- process.c | 39 ++++++++++++++++----------------------- 4 files changed, 48 insertions(+), 26 deletions(-) diff --git a/ChangeLog b/ChangeLog index fd08474..4f13366 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,12 @@ +2008-03-24 Soren Sandmann + + * collector.c (collect_traces): Call back after collecting all + traces. + + * TODO: update + + * process.c: Simpler code to find vmlinux + Sat Mar 29 11:14:38 2008 Søren Sandmann * unwind.[ch], testunwind.c: Beginning of a dwarf unwinder. diff --git a/TODO b/TODO index 20ff100..72e4f7f 100644 --- a/TODO +++ b/TODO @@ -121,6 +121,22 @@ Before 1.2: - do heuristic stackwalk in kernel - do heuristic stackwalk in userland + - Send heuristic stack trace to user space, along with + location on the stack. Then, in userspace analyze the + machine code to determine the size of the stack frame at any + point. The instructions that would need to be recognized are: + + subl , %esp + addl , %esp + leave + jcc + push + pop + + GCC is unlikely to have different stack sizes at the entry + to a basic block. + + We can often find a vmlinux in /lib/modules//build. * "Expand all" is horrendously slow because update_screenshot gets called for every "expanded" signal. In fact even normal expanding is really diff --git a/collector.c b/collector.c index 86f49ca..ce18e47 100644 --- a/collector.c +++ b/collector.c @@ -170,6 +170,8 @@ in_dead_period (Collector *collector) static void collect_traces (Collector *collector) { + gboolean first; + /* After a reset we ignore samples for a short period so that * a reset will actually cause 'samples' to become 0 */ @@ -179,6 +181,8 @@ collect_traces (Collector *collector) return; } + first = collector->n_samples == 0; + while (collector->current != collector->map_area->head) { const SysprofStackTrace *trace; @@ -211,10 +215,10 @@ collect_traces (Collector *collector) collector->current = 0; collector->n_samples++; - - if (collector->callback) - collector->callback (collector->n_samples == 1, collector->data); } + + if (collector->callback) + collector->callback (first, collector->data); } static void diff --git a/process.c b/process.c index fbb57ad..a5824a4 100644 --- a/process.c +++ b/process.c @@ -446,35 +446,28 @@ file_exists (const char *name) static gchar * look_for_vmlinux (void) { + static const char names[][48] = { + "/lib/modules/%s/build/vmlinux", + "/usr/lib/debug/lib/modules/%s/vmlinux", + "/lib/modules/%s/source/vmlinux", + "/boot/vmlinux-%s", + }; struct utsname utsname; - char *result; - char **s; - char *names[4]; - + int i; + uname (&utsname); - names[0] = g_strdup_printf ( - "/usr/lib/debug/lib/modules/%s/vmlinux", utsname.release); - names[1] = g_strdup_printf ( - "/lib/modules/%s/source/vmlinux", utsname.release); - names[2] = g_strdup_printf ( - "/boot/vmlinux-%s", utsname.release); - names[3] = NULL; - - result = NULL; - for (s = names; *s; s++) + for (i = 0; i < G_N_ELEMENTS (names); ++i) { - if (file_exists (*s)) - { - result = g_strdup (*s); - break; - } - } + char *filename = g_strdup_printf (names[i], utsname.release); - for (s = names; *s; s++) - g_free (*s); + if (file_exists (filename)) + return filename; - return result; + g_free (filename); + } + + return NULL; } static const gchar * -- 2.7.4