Я хочу, чтобы иметь возможность печатать трассировки стека java style в c

Простой вопрос, я хочу, чтобы иметь возможность печатать трассировки стека java style в c. У меня есть обработчики сигналов, и я получаю адреса трассировки стека, но я хочу перевести адреса на имена функций. Поэтому я решил осуществить рефлексию. Сейчас у меня есть таблицы следующим образом: {«FOO», & FOO, «BAR» и & BAR}. Несмотря на то, что это решение работает для всех платформ, очень неудобно постоянно обновляться. Есть ли другой способ сделать это (тот, который не требует ручного содержания?)

    Я думаю, что http://www.gnu.org/s/libc/manual/html_node/Backtraces.html вы можете найти ответ на этот вопрос.

      #include  #include  #include  /* Obtain a backtrace and print it to stdout. */ void print_trace (void) { void *array[10]; size_t size; char **strings; size_t i; size = backtrace (array, 10); strings = backtrace_symbols (array, size); printf ("Obtained %zd stack frames.\n", size); for (i = 0; i < size; i++) printf ("%s\n", strings[i]); free (strings); } /* A dummy function to make the backtrace more interesting. */ void dummy_function (void) { print_trace (); } int main (void) { dummy_function (); return 0; } 

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

    Вам не нужно следить за таблицами самостоятельно, компоновщик сделает это за вас уже. Это называется «таблицей символов». Вы можете настроить ваш компилятор / компоновщик, чтобы включить эту таблицу в окончательный вывод или оставить ее. Вы можете использовать эту таблицу для поиска имен функций при ходьбе в стеке.

    Если вам нужна простая трассировка стека в C, используйте отладчик, например GDB. В противном случае уже есть библиотеки и другие решения, обеспечивающие эту функциональность. Посмотрите на это, например: http://www.nongnu.org/libunwind/

    Вы можете посмотреть предлагаемые здесь решения: http://bytes.com/topic/c/answers/219429-stacktrace-code-snippet-like-gdbs-bt

    или здесь: http://tlug.up.ac.za/wiki/index.php/Obtaining_a_stack_trace_in_C_upon_SIGSEGV

    Вы можете использовать соглашения в GOzject Introspection: http://live.gnome.org/GObjectIntrospection