Вызов функции C и трассировка параметров - генерация тестового примера и макета - PullRequest
8 голосов
/ 23 февраля 2012

У меня есть большая кодовая база довольно старого кода на C во встроенной системе, и, к сожалению, нет автоматических тестов / наборов. Это делает реструктуризацию и рефакторинг кода опасной задачей.

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

Наличие таких тестовых примеров сделает рефакторинг менее опасным.

Существуют ли решения, которые уже могут это сделать? Что было бы самым простым способом заставить это работать, если бы мне пришлось самому кодировать это?

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

1 Ответ

1 голос
/ 23 февраля 2012

Существует опция gcc "-finstrument-functions", механизм которой вы можете использовать для определения ваших собственных обратных вызовов для входа / выхода каждой функции.

Google, и вы можете найти много хороших примеров.

[Редактировать] с обратным вызовом этой опции gcc вы можете отслеживать только вход / выход функции, а не параметры. но с некоторыми хитростями вы также можете отслеживать параметры. (пройти через текущий указатель кадра, чтобы получить параметр в стеке).

Вот статья, рассказывающая об идее реализации:

http://linuxgazette.net/151/melinte.html

Кроме того, в зависимости от вашей встроенной системы, на linux вы можете попробовать что-то вроде ltrace, чтобы показать параметры (например, strace way). Существует множество инструментов, выполняющих функцию трассировки функций в пользовательском пространстве или пространстве ядра в linux, ftrace / ust / ltrace / utrace / strace / systemtap /. В любом случае, если вы не добавите какой-либо жесткий код отладки, невозможно правильно отобразить параметры. Если вы примете меры для добавления информации об отладке входа / выхода, тогда это будет намного проще.

Также здесь есть аналогичная ветка, рассказывающая об этой проблеме.

Инструмент для отслеживания локальных вызовов функций в Linux

...