[sysprof] Make sure parser->symbols is non-NULL after read_table()
- From: Søren Sandmann Pedersen <ssp src gnome org>
- To: svn-commits-list gnome org
- Cc:
- Subject: [sysprof] Make sure parser->symbols is non-NULL after read_table()
- Date: Mon, 14 Sep 2009 09:09:02 +0000 (UTC)
commit 6e1e43ff3bdfe33811d387c33db5f73edf4a1675
Author: Søren Sandmann Pedersen <ssp redhat com>
Date: Tue Sep 8 01:26:29 2009 -0400
Make sure parser->symbols is non-NULL after read_table()
Otherwise, we would read the file over and over.
Also get the process name from /proc/pid/cmdline, falling back to
/proc/pid/status if there is nothing there.
elfparser.c | 13 +++++++++++--
tracker.c | 36 ++++++++++++++++++++++++++----------
2 files changed, 37 insertions(+), 12 deletions(-)
---
diff --git a/elfparser.c b/elfparser.c
index e543a40..e13cfca 100644
--- a/elfparser.c
+++ b/elfparser.c
@@ -432,6 +432,10 @@ read_table (ElfParser *parser,
{
int sym_size = bin_record_get_size (parser->sym_format);
int i, n_symbols;
+
+#if 0
+ g_print ("elf: Reading table for %s\n", parser->filename? parser->filename : "<unknown>");
+#endif
parser->n_symbols = sym_table->size / sym_size;
parser->symbols = g_new (ElfSym, parser->n_symbols);
@@ -505,7 +509,12 @@ read_table (ElfParser *parser,
parser->sym_strings = str_table->offset;
parser->n_symbols = n_symbols;
- parser->symbols = g_renew (ElfSym, parser->symbols, parser->n_symbols);
+
+ /* Allocate space for at least one symbol, so that parser->symbols will be
+ * non-NULL. If it ends up being NULL, we will be parsing the file over and
+ * over.
+ */
+ parser->symbols = g_renew (ElfSym, parser->symbols, parser->n_symbols + 1);
qsort (parser->symbols, parser->n_symbols, sizeof (ElfSym), compare_sym);
}
@@ -583,7 +592,7 @@ elf_parser_lookup_symbol (ElfParser *parser,
if (!parser->symbols)
{
#if 0
- g_print ("reading symbols\n");
+ g_print ("reading symbols at %p\n", parser);
#endif
read_symbols (parser);
}
diff --git a/tracker.c b/tracker.c
index b3e0f75..f89abcf 100644
--- a/tracker.c
+++ b/tracker.c
@@ -80,23 +80,39 @@ static void
fake_new_process (tracker_t *tracker, pid_t pid)
{
char **lines;
+ gboolean done = FALSE;
- if ((lines = get_lines ("/proc/%d/status", pid)))
+ if ((lines = get_lines ("/proc/%d/cmdline", pid)))
+ {
+ if (lines[0] && strlen (lines[0]) > 0)
+ {
+ tracker_add_process (tracker, pid, lines[0]);
+ done = TRUE;
+ }
+
+ g_strfreev (lines);
+ }
+
+ if (!done && (lines = get_lines ("/proc/%d/status", pid)))
{
int i;
-
+
for (i = 0; lines[i] != NULL; ++i)
{
if (strncmp ("Name:", lines[i], 5) == 0)
{
- tracker_add_process (
- tracker, pid, g_strstrip (strchr (lines[i], ':') + 1));
-
- break;
- }
- }
-
- g_strfreev (lines);
+ char *name = g_strstrip (strchr (lines[i], ':') + 1);
+
+ if (strlen (name) > 0)
+ {
+ tracker_add_process (tracker, pid, name);
+ done = TRUE;
+ break;
+ }
+ }
+ }
+
+ g_strfreev (lines);
}
}
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]