summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGustavo Sverzut Barbieri <barbieri@profusion.mobi>2016-12-03 12:57:24 -0200
committerGustavo Sverzut Barbieri <barbieri@profusion.mobi>2016-12-03 13:01:36 -0200
commit84a0f047db9fcd0efd2c29c85ba41fd8f624de3d (patch)
treef93598099884bfb6b819644efef281f911fe472d
parent683a508c204197a843e13d4c64c94474332eb04d (diff)
downloadefl-84a0f047db9fcd0efd2c29c85ba41fd8f624de3d.tar.gz
eina_btlog: compact output and keep non-bt information.
Now we keep all non-bt prefixes as well, in conjunction with compact mode it looks like we resolved the address to lines in the output. Example: ``` $ cat bt-new.txt ERR<23314>:eo_lifecycle ../src/lib/eo/efl_object.eo.c:78 efl_del() 0x00000004e401ca: libeo_dbg.so+0x91ca (in src/lib/eo/.libs/libeo_dbg.so 0x4e37000) ERR<23314>:eo_lifecycle ../src/lib/eo/efl_object.eo.c:78 efl_del() 0x00000004e3fb42: _efl_add_internal_start+0x1c2 (in src/lib/eo/.libs/libeo_dbg.so 0x4e37000) ERR<23314>:eo_lifecycle ../src/lib/eo/efl_object.eo.c:78 efl_del() 0x0000000010a85f: lt-efl_net_dialer_simple_example+0x285f (in /home/gustavo/Development/git/efl/src/examples/ecore/.libs/lt-efl_net_dialer_simple_example 0x108000) ERR<23314>:eo_lifecycle ../src/lib/eo/efl_object.eo.c:78 efl_del() 0x00000005c7c291: __libc_start_main+0xf1 (in /usr/lib/libc.so.6 0x5c5c000) ERR<23314>:eo_lifecycle ../src/lib/eo/efl_object.eo.c:78 efl_del() 0x0000000010a38a: _start+0x2a (in /home/gustavo/Development/git/efl/src/examples/ecore/.libs/lt-efl_net_dialer_simple_example 0x108000) ERR<23314>:eo_lifecycle ../src/lib/eo/efl_object.eo.c:78 efl_del() obj_id=0x400000007feb55b9 deleted obj=0x97870b0, class=0x9785850 (Efl_Net_Dialer_Simple) [0.9045s, 0.0198 ago]: ERR<23314>:eo_lifecycle ../src/lib/eo/efl_object.eo.c:78 efl_del() 0x00000004e409aa: libeo_dbg.so+0x99aa (in src/lib/eo/.libs/libeo_dbg.so 0x4e37000) ERR<23314>:eo_lifecycle ../src/lib/eo/efl_object.eo.c:78 efl_del() 0x00000004e407f1: libeo_dbg.so+0x97f1 (in src/lib/eo/.libs/libeo_dbg.so 0x4e37000) ERR<23314>:eo_lifecycle ../src/lib/eo/efl_object.eo.c:78 efl_del() 0x00000004e3eee8: libeo_dbg.so+0x7ee8 (in src/lib/eo/.libs/libeo_dbg.so 0x4e37000) ERR<23314>:eo_lifecycle ../src/lib/eo/efl_object.eo.c:78 efl_del() 0x00000004e3f09e: _efl_object_call_end+0x4e (in src/lib/eo/.libs/libeo_dbg.so 0x4e37000) ERR<23314>:eo_lifecycle ../src/lib/eo/efl_object.eo.c:78 efl_del() 0x00000004e48a65: efl_del+0x105 (in src/lib/eo/.libs/libeo_dbg.so 0x4e37000) ERR<23314>:eo_lifecycle ../src/lib/eo/efl_object.eo.c:78 efl_del() 0x0000000010ac2c: lt-efl_net_dialer_simple_example+0x2c2c (in /home/gustavo/Development/git/efl/src/examples/ecore/.libs/lt-efl_net_dialer_simple_example 0x108000) ERR<23314>:eo_lifecycle ../src/lib/eo/efl_object.eo.c:78 efl_del() 0x00000005c7c291: __libc_start_main+0xf1 (in /usr/lib/libc.so.6 0x5c5c000) ERR<23314>:eo_lifecycle ../src/lib/eo/efl_object.eo.c:78 efl_del() 0x0000000010a38a: _start+0x2a (in /home/gustavo/Development/git/efl/src/examples/ecore/.libs/lt-efl_net_dialer_simple_example 0x108000) ERR<24641>:eo_lifecycle ../src/lib/eo/efl_object.eo.c:78 efl_del() obj_id=0x400000007c9a1109 was already deleted 0.0287 seconds ago! ``` Results in: ``` $ cat /tmp/bt-new.txt | eina_btlog -c ERR<23314>:eo_lifecycle ../src/lib/eo/efl_object.eo.c:78 efl_del() _eo_log_obj_new (in eo.c:2691) ERR<23314>:eo_lifecycle ../src/lib/eo/efl_object.eo.c:78 efl_del() _efl_add_internal_start (in eo.c:844) ERR<23314>:eo_lifecycle ../src/lib/eo/efl_object.eo.c:78 efl_del() main (in efl_net_dialer_simple_example.c:375) ERR<23314>:eo_lifecycle ../src/lib/eo/efl_object.eo.c:78 efl_del() __libc_start_main (in ??:375) ERR<23314>:eo_lifecycle ../src/lib/eo/efl_object.eo.c:78 efl_del() _start (in ??:375) ERR<23314>:eo_lifecycle ../src/lib/eo/efl_object.eo.c:78 efl_del() obj_id=0x400000007feb55b9 deleted obj=0x97870b0, class=0x9785850 (Efl_Net_Dialer_Simple) [0.9045s, 0.0198 ago]: ERR<23314>:eo_lifecycle ../src/lib/eo/efl_object.eo.c:78 efl_del() _eo_log_obj_free (in eo.c:2714) ERR<23314>:eo_lifecycle ../src/lib/eo/efl_object.eo.c:78 efl_del() _eo_free (in eo.c:974) ERR<23314>:eo_lifecycle ../src/lib/eo/efl_object.eo.c:78 efl_del() _efl_unref_internal (in eo_private.h:342) ERR<23314>:eo_lifecycle ../src/lib/eo/efl_object.eo.c:78 efl_del() _efl_object_call_end (in eo.c:620) ERR<23314>:eo_lifecycle ../src/lib/eo/efl_object.eo.c:78 efl_del() efl_del (in efl_object.eo.c:78) ERR<23314>:eo_lifecycle ../src/lib/eo/efl_object.eo.c:78 efl_del() main (in efl_net_dialer_simple_example.c:447) ERR<23314>:eo_lifecycle ../src/lib/eo/efl_object.eo.c:78 efl_del() __libc_start_main (in ??:447) ERR<23314>:eo_lifecycle ../src/lib/eo/efl_object.eo.c:78 efl_del() _start (in ??:447) ERR<24641>:eo_lifecycle ../src/lib/eo/efl_object.eo.c:78 efl_del() obj_id=0x400000007c9a1109 was already deleted 0.0287 seconds ago! ``` which is similar to valgrind's log and is MUCH nicer to read :-) This commit also simplifies alignment and color display by using a single printf().
-rw-r--r--src/bin/eina/eina_btlog.c170
1 files changed, 98 insertions, 72 deletions
diff --git a/src/bin/eina/eina_btlog.c b/src/bin/eina/eina_btlog.c
index b69927efd9..a0a5ab107d 100644
--- a/src/bin/eina/eina_btlog.c
+++ b/src/bin/eina/eina_btlog.c
@@ -75,6 +75,7 @@ static Translate_Func _translate = NULL;
static const char *_prog = NULL;
static Eina_Bool color = EINA_TRUE;
static Eina_Bool show_comments = EINA_TRUE;
+static Eina_Bool show_compact = EINA_FALSE;
static void
path_split(const char *path, char **dir, char **file)
@@ -230,14 +231,59 @@ end:
}
#endif
+static const char *
+bt_input_translate(const char *line, char **comment)
+{
+ static char local[PATH_MAX + sizeof(" 0x1234567890123456789 0x1234567890123456789\n")];
+ const char *addrstart, *addrend, *filestart, *fileend, *basestart, *baseend;
+
+ /* new bt format is more human readable, but needs some cleanup before we bt_append()
+ *
+ * Example:
+ * ERR<23314>:eo_lifecycle ../src/lib/eo/efl_object.eo.c:78 efl_del() 0x00000005c7c291: __libc_start_main+0xf1 (in /usr/lib/libc.so.6 0x5c5c000)
+ * ERR<23314>:eo_lifecycle ../src/lib/eo/efl_object.eo.c:78 efl_del() 0x00000004e409aa: libeo_dbg.so+0x99aa (in src/lib/eo/.libs/libeo_dbg.so 0x4e37000)
+ */
+ *comment = NULL;
+
+ addrstart = strstr(line, "0x");
+ if (!addrstart) return NULL;
+
+ addrend = strchr(addrstart, ':');
+ if (!addrend) return NULL;
+
+ filestart = strstr(addrend, "(in ");
+ if (!filestart) return NULL;
+
+ filestart += strlen("(in ");
+ basestart = strstr(filestart, " 0x");
+ if (!basestart) return NULL;
+ fileend = basestart;
+ basestart += strlen(" ");
+ baseend = strchr(basestart, ')');
+ if (!baseend) return NULL;
+
+ snprintf(local, sizeof(local), "%.*s %.*s %.*s\n",
+ (int)(fileend - filestart), filestart,
+ (int)(addrend - addrstart), addrstart,
+ (int)(baseend - basestart), basestart);
+ *comment = strndup(line, addrstart - line);
+ return local;
+}
+
static Eina_List *
bt_append(Eina_List *btl, const char *btline)
{
Bt *bt = calloc(1, sizeof(Bt));
if (!bt) return btl;
+ const char *translation;
+ char *comment = NULL;
char *bin = strdup(btline);
unsigned long long offset = 0, base = 0;
+ translation = bt_input_translate(btline, &comment);
+ if (translation)
+ btline = translation;
+
// parse:
// /usr/local/lib/libeina.so.1 0x1ec88
// /usr/local/lib/libelementary.so.1 0x10f695
@@ -263,10 +309,12 @@ bt_append(Eina_List *btl, const char *btline)
bt->func_name = strdup("");
}
}
+ bt->comment = comment;
btl = eina_list_append(btl, bt);
}
else
{
+ free(comment);
bt->comment = strdup(btline);
btl = eina_list_append(btl, bt);
}
@@ -275,43 +323,6 @@ bt_append(Eina_List *btl, const char *btline)
return btl;
}
-static const char *
-bt_input_translate(char *line)
-{
- static char local[PATH_MAX + sizeof(" 0x1234567890123456789 0x1234567890123456789\n")];
- const char *addrstart, *addrend, *filestart, *fileend, *basestart, *baseend;
-
- /* new bt format is more human readable, but needs some cleanup before we bt_append()
- *
- * Example:
- * ERR<23314>:eo_lifecycle ../src/lib/eo/efl_object.eo.c:78 efl_del() 0x00000005c7c291: __libc_start_main+0xf1 (in /usr/lib/libc.so.6 0x5c5c000)
- * ERR<23314>:eo_lifecycle ../src/lib/eo/efl_object.eo.c:78 efl_del() 0x00000004e409aa: libeo_dbg.so+0x99aa (in src/lib/eo/.libs/libeo_dbg.so 0x4e37000)
- */
-
- addrstart = strstr(line, "0x");
- if (!addrstart) return line;
-
- addrend = strchr(addrstart, ':');
- if (!addrend) return line;
-
- filestart = strstr(addrend, "(in ");
- if (!filestart) return line;
-
- filestart += strlen("(in ");
- basestart = strstr(filestart, " 0x");
- if (!basestart) return line;
- fileend = basestart;
- basestart += strlen(" ");
- baseend = strchr(basestart, ')');
- if (!baseend) return line;
-
- snprintf(local, sizeof(local), "%.*s %.*s %.*s\n",
- (int)(fileend - filestart), filestart,
- (int)(addrend - addrstart), addrstart,
- (int)(baseend - basestart), basestart);
- return local;
-}
-
static Eina_Bool
_translation_function_detect(const Translation_Desc *desc)
{
@@ -345,6 +356,12 @@ main(int argc, char **argv)
char buf[4096];
Bt *bt;
int cols[6] = { 0 }, len, i;
+ const char *func_color = "";
+ const char *dir_color = "";
+ const char *sep_color = "";
+ const char *file_color = "";
+ const char *line_color = "";
+ const char *reset_color = "";
const Translation_Desc desc[] = {
#ifdef ATOS_COMPATIBLE
{ /* Mac OS X */
@@ -383,7 +400,8 @@ main(int argc, char **argv)
{
printf("Usage: eina_btlog [-n]\n"
" -n Do not use color escape codes\n"
- " -C Do not show comments (non-bt lines)\n"
+ " -C Do not show comments (non-bt fragments)\n"
+ " -c Show compact output format\n"
"\n"
"Provide addresses logged from EFL applications to stdin.\n"
"Example:\n\n"
@@ -394,6 +412,17 @@ main(int argc, char **argv)
}
else if (!strcmp(argv[i], "-n")) color = EINA_FALSE;
else if (!strcmp(argv[i], "-C")) show_comments = EINA_FALSE;
+ else if (!strcmp(argv[i], "-c")) show_compact = EINA_TRUE;
+ }
+
+ if (color)
+ {
+ func_color = EINA_COLOR_GREEN;
+ dir_color = EINA_COLOR_BLUE;
+ sep_color = EINA_COLOR_CYAN;
+ file_color = EINA_COLOR_WHITE;
+ line_color = EINA_COLOR_YELLOW;
+ reset_color = EINA_COLOR_RESET;
}
if (!_translation_function_detect(desc))
@@ -405,7 +434,7 @@ main(int argc, char **argv)
while (fgets(buf, sizeof(buf) - 1, stdin))
{
- btl = bt_append(btl, bt_input_translate(buf));
+ btl = bt_append(btl, buf);
}
EINA_LIST_FOREACH(btl, l, bt)
{
@@ -432,42 +461,39 @@ main(int argc, char **argv)
if (bt->comment && show_comments)
fputs(bt->comment, stdout);
if (!bt->bin_dir) continue;
- len = strlen(bt->bin_dir);
- for (i = 0; i < (cols[0] - len); i++) printf(" ");
- if (color)
- printf(" \033[34m%s\033[01m\033[36m/\033[37m%s\033[0m",
- bt->bin_dir, bt->bin_name);
- else
- printf(" %s/%s",
- bt->bin_dir, bt->bin_name);
- len = strlen(bt->bin_name);
- for (i = 0; i < (cols[1] - len); i++) printf(" ");
- printf(" | ");
- len = strlen(bt->file_dir);
- for (i = 0; i < (cols[2] - len); i++) printf(" ");
- if (color)
- printf("\033[34m%s\033[01m\033[36m/\033[37m%s\033[0m",
- bt->file_dir, bt->file_name);
- else
- printf("%s/%s",
- bt->file_dir, bt->file_name);
- len = strlen(bt->file_name);
- for (i = 0; i < (cols[3] - len); i++) printf(" ");
- printf(" : ");
- snprintf(buf, sizeof(buf), "%i", bt->line);
- len = strlen(buf);
- for (i = 0; i < (cols[4] - len); i++) printf(" ");
- if (color)
+ if (show_compact)
{
- printf("\033[01m\033[33m%s\033[0m @ \033[32m%s\033[36m()", buf, bt->func_name);
- printf("\033[0m\n");
+ printf("%s%s%s (in %s%s%s:%s%d%s)\n",
+ func_color, bt->func_name, reset_color,
+ file_color, bt->file_name, reset_color,
+ line_color, bt->line, reset_color);
+ continue;
}
- else
- {
- printf("%s @ %s()", buf, bt->func_name);
- printf("\n");
- }
+
+ printf(" "
+ "%s%*s%s/%s%-*s%s" /* bin info */
+ "| "
+ "%s%*s%s/%s%-*s%s" /* file info */
+ ": "
+ "%s%*i%s" /* line info */
+ " @ "
+ "%s%s%s()%s\n", /* func info */
+ /* bin info */
+ dir_color, cols[0], bt->bin_dir, sep_color,
+ file_color, cols[1], bt->bin_name,
+ reset_color,
+ /* file info */
+ dir_color, cols[2], bt->file_dir, sep_color,
+ file_color, cols[3], bt->file_name,
+ reset_color,
+ /* line info */
+ line_color, cols[4], bt->line,
+ reset_color,
+ /* func info */
+ func_color, bt->func_name,
+ sep_color,
+ reset_color);
}
return 0;
}