Есть ли 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.
Я положил здесь отдельную вилку: