Статические и нестатические функции - отладка контекста встроенных систем - PullRequest
7 голосов
/ 08 марта 2012

Я был озадачен следующим вопросом: Как сохранить преимущество «статической» метки, но при этом иметь возможность отлаживать производственный код на сайте?

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

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

Мне известны такие варианты, как компиляция как минимум двух разных сборок, одна со статической, а другая без, но это хорошо подходит для автоматизациитесты, а не с окончательной производственной сборкой, которая в конечном итоге выйдет.

Буду признателен за некоторые идеи с вашей стороны, в основном о том, как вы решили (если таковые имеются) эту дилемму.Или перефразируя вопрос: « Что важнее? »

Хорошее обсуждение «статического» в C здесь .

Ответы [ 3 ]

3 голосов
/ 09 марта 2012

Я думаю, что основной вопрос не в том, что " вы отправляете со" статическим "или нет? ", это ". Вы проверяете, что именно отправляете ?"Для встроенного кода, если вы проводите большую часть тестирования на сборке Debug, а затем отправляете версию выпуска, скомпилированную с различными параметрами, вы, по сути, отправляете непроверенный код своему клиенту.Когда вы работаете так близко к оборудованию, небольшие изменения в синхронизации или шаблонах доступа к памяти (которые может легко внести оптимизатор) могут вызвать большие изменения в поведении системы.

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

Да, я даю некоторые возможные преимущества, сгенерированные компилятором, но пока я гарантирую, что версия Debug достаточно быстра, чтобы соответствовать ее требованиям,это не проблема.И выигрыш в том, что код, который я отправляю, в точности совпадает с кодом, который я тестировал на протяжении всего цикла выпуска, - никаких сюрпризов от оптимизатора.

1 голос
/ 08 марта 2012

Можете ли вы поставить точку останова в общедоступной функции, которая вызывает статическую функцию?Затем вы можете проверить входящие аргументы и, по крайней мере, возвращаемые значения.Если проблема возникает только на объекте заказчика, а ваши модульные тесты / интеграционные тесты не показывают проблем для входных данных, которые вы ожидаете получить от этих функций, проблема, вероятно, состоит в том, что эти функции получают входные данные (или последовательность входных данных, еслифункция с каким-то состоянием) вы не ожидали, то есть фактическая проблема может быть за пределами статических функций, которые вы просматриваете.

Если вы уже подозреваете, что знаете, какая статическая функция содержит проблему, и вы знаете, чтоСортировка входных данных, которые, как вы подозреваете, вызывают проблему, вы можете поместить в сборку релиза простую функцию модульного тестирования, чтобы просто проверить наличие ошибки, которую вы подозреваете.Конечно, это усложняется, если эта функция напрямую управляет, например, шеститонным краном, и в этом случае вам, возможно, придется написать две версии функции, одну с макетом для управления краном, и провести на нем свои тесты.

Наименее вероятно, но не невозможно, никогда не исключайте несоответствия компилятора между сборками выпуска и отладки.Нам всем нравится думать, что компиляторы безошибочны, включая меня, но вещи случаются.И я вижу в вашем ответе torek, что предоставление клиенту отладочной сборки иногда решает проблемы ...

1 голос
/ 08 марта 2012

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

(Встроенное расширение на сайте вызова на самом деле не является свойством, относящимся к «static»«просто компиляторы с большей вероятностью будут делать это, потому что они« знают больше »о функции, в частности, о том, что имя не видно за пределами текущей единицы перевода, поэтому код функции может быть полностью опущен, если все его вызовы расширеныin-line.)

Когда-то было принято использовать макрос:

#ifndef STATIC
#  define STATIC static
#endif
...
STATIC void somefunc() { ... }

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

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