diff options
author | Gustavo Sverzut Barbieri <barbieri@profusion.mobi> | 2016-12-03 11:59:48 -0200 |
---|---|---|
committer | Gustavo Sverzut Barbieri <barbieri@profusion.mobi> | 2016-12-03 13:01:36 -0200 |
commit | 2aa247b33439d5bfc73297c9de25a4984df163a4 (patch) | |
tree | 4da28c533be30f10054f93ad536e91359e900e9a | |
parent | 349daa458fda75d5287146dea7721d15a579d586 (diff) | |
download | efl-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.c | 39 |
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) { |