Как добавить операторы print в каждую функцию в c файлах прямо программно? - PullRequest
7 голосов
/ 13 марта 2011

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

Часто случается, что я помещаю кучу операторов печати, строю свой код и запускаю его только для того, чтобы понять, что я должен был печатать и в дюжине других мест. А затем снова запустите часовой процесс.

Есть ли простой способ взять мои файлы 5 или 6 с, которые я хочу проанализировать, и запустить какой-нибудь инструмент, который добавит оператор печати в каждую функцию? (это, очевидно, должно быть после объявления переменных, как в C)

Еще лучше было бы печатать каждый раз, когда есть if / else или switch / case ... в основном любые условные операторы.

Ответы [ 5 ]

11 голосов
/ 13 марта 2011

Вы не указываете используемый вами компилятор, но у gcc есть очень удобный переключатель:

-finstrument-functions

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

Вызовы выполняются для двух функций, которые вы должны создать:

      void __cyg_profile_func_enter (void *this_fn,
                                     void *call_site);
      void __cyg_profile_func_exit  (void *this_fn,
                                     void *call_site);

Etrace - это инструмент, разработанныйдля использования этого для создания следов вызова см. http://ndevilla.free.fr/etrace/

1 голос
/ 13 марта 2011

вы можете использовать такие макросы, как этот

 #define begin {printf(__func__##" Started");
 #define end printf(__func__##" Ended");}

, а затем заменить все ваши {, } на макросы начала и конца (__func__ - это макрос, который возвращает имя функции и определен в C99 там).также другие эквивалентные макросы для других компиляторов)

0 голосов
/ 13 марта 2011

Я бы порекомендовал вам использовать отладчик, например, GBD. Таким образом, вы даже можете запускать свою программу «шаг за шагом» и анализировать такие условия. Я не вижу смысла что-то печатать в каждой функции.

0 голосов
/ 13 марта 2011

Если vim ваш любимый редактор, вы можете установить этот плагин: http://www.vim.org/scripts/script.php?script_id=213 и настроить соответствующий шаблон.Может быть полезно для множества разных задач.(Это работает для новых функций, которые вы определите, это не ваш случай, но может быть полезно для будущего использования)

0 голосов
/ 13 марта 2011

Только для 5-6 файлов я бы вручную вошел и добавил макрос PRINT ("имя функции") в каждую функцию, а затем определил, что либо выводить строку, либо ничего

Вы можете использовать ctags для анализа файлов и их автоматической сборки, но если у вас нет сотен файлов, было бы быстрее просто сделать это вручную

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