Я развиваюсь под Linux/gcc
В настоящее время я использую следующее, чтобы получить трассировку стека для пользовательских исключений. Demangled
имена функций и line numbers
как и ожидалось, но я хотел бы избежать использования addr2line
иметь полный контроль над форматированием выходных строк.
static void posix_print_stack_trace()
{
int i, trace_size = 0;
char **messages = (char **)NULL;
trace_size = backtrace(stack_traces, MAX_STACK_FRAMES);
messages = backtrace_symbols(stack_traces, trace_size);
for (i = 0; i < trace_size; ++i)
{
if (addr2line(program_invocation_name, stack_traces[i]) != 0)
{
printf(" error determining line # for: %s\n", messages[i]);
}
}
if (messages) { free(messages); }
}
static int addr2line(char const * const program_name, void const * const addr)
{
char addr2line_cmd[512] = {0};
sprintf(addr2line_cmd,"addr2line -C -f -p -i -e %.256s %p", program_name, addr);
return system(addr2line_cmd);
}
Замечания : Использование -f
для отображения имен функций в игре в трассировке стека и -C
чтобы отобразить их деформированными.
Q: Кто-нибудь может указать мне на программное решение?
(И если возможно, дайте мне несколько советов о том, как заставить это работать также с MinGW/gcc
).
NB: Или, может быть, просто используете gdb
каким-то образом может помочь в получении более персонализированной продукции?
Спасибо за помощь.
РЕДАКТИРОВАТЬ Это похоже на часть окон, это выполнимо таким образом: https://stackoverflow.com/a/6207030/1715716
РЕДАКТИРОВАТЬ : Вышеприведенное указывает на решение только для Microsoft Visual, поэтому, в конце концов, для меня бесполезно
Вы, вероятно, могли бы использовать или адаптировать (по крайней мере в Linux и системах, использующих ELF и DWARF) libbacktrace
Ян Тейлор, который в настоящее время находится внутри дерева исходных текстов GCC. Увидеть Вот; в принципе, он должен использоваться независимо от GCC (при условии, что вы подчиняетесь его BSD-подобной лицензии).
Других решений пока нет …