linux — c ++: программно конвертировать символы в номера строк кода

Я развиваюсь под 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, поэтому, в конце концов, для меня бесполезно

3

Решение

Вы, вероятно, могли бы использовать или адаптировать (по крайней мере в Linux и системах, использующих ELF и DWARF) libbacktrace Ян Тейлор, который в настоящее время находится внутри дерева исходных текстов GCC. Увидеть Вот; в принципе, он должен использоваться независимо от GCC (при условии, что вы подчиняетесь его BSD-подобной лицензии).

3

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]