Я хочу, чтобы иметь возможность печатать следы стека в стиле Java в C - PullRequest
1 голос
/ 21 декабря 2010

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

Ответы [ 4 ]

1 голос
/ 21 декабря 2010

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

 #include <execinfo.h>
 #include <stdio.h>
 #include <stdlib.h>

 /* 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, иначе вы получитевозврат адресов вместо имен функций:)

1 голос
/ 21 декабря 2010

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

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

0 голосов
/ 21 декабря 2010

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

0 голосов
/ 21 декабря 2010

Возможно, вы захотите взглянуть на предлагаемые решения здесь: 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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...