Есть ли addr2line, которая анализирует код в памяти?

Я использую addr2line проанализировать трассировку стека после возникновения исключения (используя backtrace и backtrace_symbols). В настоящее время требуется около 2 секунд для анализа двоичного файла размером 120 МБ (отладочная сборка) с диска.

Существует ли библиотека (LGPL), которая выполняет ту же работу, анализируя сегмент кода в памяти? Конечно, это ограничивает меня в анализе только собственного приложения, но в моем случае этого достаточно.

3 ответа

Вы хотите (лицензированный BSD) libunwind:

void backtrace(void)
{
    int r;
    unw_cursor_t cursor; unw_context_t uc; 
    unw_word_t ip, sp; 
    char symname[100];

    unw_getcontext(&uc);
    unw_init_local(&cursor, &uc);
    while (unw_step(&cursor) > 0) {
        r = unw_get_reg(&cursor, UNW_REG_IP, &ip);
        assert(r == 0);
        r = unw_get_reg(&cursor, UNW_REG_SP, &sp);
        assert(r == 0);
        r = unw_get_proc_name(&cursor, symname, sizeof(symname), NULL);
        assert(r == 0);
        fprintf(stderr, "%s: ip: %lx, sp: %lx\n", symname, (long) ip, (long) sp);
    }   
}

Обратите внимание, что unw_get_proc_name() потерпит неудачу (вернет не 0), если вы удалите таблицы символов и строк из ваших двоичных файлов.

Может быть, вы можете использовать исполняемый файл, распознаваемый файловой системой proc? (или это на самом деле исполняемый файл в памяти процесса?)

addr2line -e /proc/32213/exe

Libbacktrace, которая является частью дистрибутива GCC, делает это. Он обрабатывает разматывание стека, символы ELF и символы отладки, т. Е. Обеспечивает функциональность как libunwind, так и addr2line.

Я положил здесь отдельную вилку:

https://github.com/ErwanLegrand/libbacktrace

Другие вопросы по тегам