backtrace_symbols () с -static и -rdynamic

Смотря на этот вопрос а также этот вопрос Я вижу это для backtrace_symbols() чтобы работать, надо скомпилировать -rdynamic флаг.

Я пробовал это в тестовой программе, и она работает, но я пишу программу, которая также скомпилирована с -static а также эта страница Говорит, что backtrace_symbols() не работает когда -static передается компилятору / компоновщику.

Есть ли какой-нибудь быстрый способ обойти это, или у меня никогда не будет удобочитаемой функции обратной трассировки в моей статически связанной программе?

10

Решение

Ответ был уже под рукой: он был в та же страница, на которую я ссылался в вопросе. В конце я успешно использовал libunwind,

#include <libunwind.h>
#include <stdio.h>

void do_backtrace()
{
unw_cursor_t    cursor;
unw_context_t   context;

unw_getcontext(&context);
unw_init_local(&cursor, &context);

while (unw_step(&cursor) > 0)
{
unw_word_t  offset, pc;
char        fname[64];

unw_get_reg(&cursor, UNW_REG_IP, &pc);

fname[0] = '\0';
(void) unw_get_proc_name(&cursor, fname, sizeof(fname), &offset);

printf ("%p : (%s+0x%x) [%p]\n", pc, fname, offset, pc);
}
}

int main()
{
do_backtrace();
return 0;
}

Я получал ошибки компоновки, потому что я (опять же) забыл разместить опции компоновщика в конце командной строки. Я действительно не понимаю, почему g++/gcc не выводите хотя бы предупреждение при игнорировании параметров командной строки. Правильная командная строка для компиляции (-g не нужен):

g++ -static unwind.cpp -o unwind -lunwind -lunwind-x86
8

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

Если вам абсолютно необходимо скомпилировать вашу программу как статическую, вы все равно можете использовать backtrace() чтобы узнать адреса функций, а затем найти имена функций, анализируя отладочную информацию, используя libdwarf, например.

Но это не простая задача, поэтому я бы предложил использовать -rdynamic флаг.

3

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