summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGustavo Sverzut Barbieri <barbieri@profusion.mobi>2016-12-03 11:59:48 -0200
committerGustavo Sverzut Barbieri <barbieri@profusion.mobi>2016-12-03 13:01:36 -0200
commit2aa247b33439d5bfc73297c9de25a4984df163a4 (patch)
tree4da28c533be30f10054f93ad536e91359e900e9a
parent349daa458fda75d5287146dea7721d15a579d586 (diff)
downloadefl-2aa247b33439d5bfc73297c9de25a4984df163a4.tar.gz
eina_btlog: understand new backtrace format used by eo.
The output of eo backtrace is much more readable than eina's default, but still misses addr2line translation done by eina_btlog, so make eina_btlog understand the new format.
-rw-r--r--src/bin/eina/eina_btlog.c39
1 files changed, 38 insertions, 1 deletions
diff --git a/src/bin/eina/eina_btlog.c b/src/bin/eina/eina_btlog.c
index 3d2441265e..f7d1034836 100644
--- a/src/bin/eina/eina_btlog.c
+++ b/src/bin/eina/eina_btlog.c
@@ -268,6 +268,43 @@ 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)
{
@@ -359,7 +396,7 @@ main(int argc, char **argv)
while (fgets(buf, sizeof(buf) - 1, stdin))
{
- btl = bt_append(btl, buf);
+ btl = bt_append(btl, bt_input_translate(buf));
}
EINA_LIST_FOREACH(btl, l, bt)
{