2013-06-04 5 views
0

Я работаю над встроенной программой. Я использую цепочку инструментов avr-gcc для компиляции источника C из моего MacBook Pro. До недавнего времени все шло хорошо. Тем не менее, в моей последней итерации разработки я, похоже, ввел какую-то прерывистую ошибку, которую я подозреваю, это какая-то ошибка стека или другой ошибки памяти.Могу ли я использовать Valgrind для поиска ошибок в статической памяти?

Я никогда не использовал Valgrind, но кажется, что он получает восторженные отзывы, но большинство ссылок, похоже, ссылаются на malloc/бесплатные типы ошибок. Я ничего не делаю. Это небольшая встроенная программа, без ОС. Может Valgrind помочь мне? Любые указатели на то, как я буду использовать его, чтобы помочь найти ошибки управления ошибками в статичной памяти в сценарии с перекрестными компиляциями, будут действительно полезны!

Или есть другой инструмент или техника, которые я должен проверить, чтобы проверить управление памятью моего кода?

+0

Доступен ли tcp/ip в вашей системе, который может использоваться для отправки информации об отладке через сокет? –

+0

Нет, нет оборудования ethernet. Всего три штыря TTL, которые мы можем наблюдать через кабели FTDI, используя хороший ol 'printf. –

ответ

1

Да, valgrind может определенно помочь вам. В дополнение к большому анализу на кучу (незаконное освобождение, утечка памяти и т. Д.) Его инструмент memcheck обнаруживает незаконные чтения и записи, то есть ситуации, когда ваша программа обращается к памяти, к которой он не должен обращаться. В этом анализе не проводится различие между статической и динамической памятью: он будет сообщать о доступе за пределами фрейма стека, обращается за пределы статического массива и т. Д. Он также обнаруживает доступ к переменным, которые ранее не были onitialized. Обе ситуации - неопределенное поведение и могут привести к сбою.

+0

Глядя далее на сайт Valgrind, действие поддерживаемых платформ не отображает atmel avr или действительно какую-либо внедренную среду. Я что-то упускаю? –

+0

@TravisGriggs: Вы можете перекрестно скомпилировать неприятный код, например. x86? –

+0

@TravisGriggs Вам нужно будет скомпилировать свой код и запустить соответствующие модули на платформе, которая запускает valgrind. Неопределенное поведение на одной платформе обычно является неопределенным поведением на других платформах, поэтому это упражнение может быть полезным. – dasblinkenlight

2

Frama-C - это структура статического анализа (в отличие от Valgrind, которая обеспечивает динамический анализ). Первоначально он был разработан с учетом встроенного, возможно, низкоуровневого кода. Плагин Frama-C «Value Analysis» в основном обнаруживает все неопределенные типы C, о которых вы можете знать во встроенном коде (включая доступ к недопустимому указателю).

Поскольку это статический анализатор, он не выполняет код (*) и поэтому идеален в кросс-скомпилированном контексте. Найдите вариант -machdep. Значения для этой опции включают x86_64 x86_32 ppc_32 x86_16.

Отказ от ответственности: Я являюсь одним из участников плагина Frama-C "value analysis".

(*), хотя если вы предоставите все входы и установите максимальную точность, он может интерпретировать исходный код as precisely as any cross-compilation+execution would.

+0

Я рад, что вернулся к своей машине, чтобы попробовать это! –

+0

@TravisGriggs Я рад это слышать.Одна рекомендация: начинайте с малого. Если вы не использовали другие инструменты семейства «формальных методов», это, вероятно, не похоже на то, с чем вы уже знакомы. Посмотрите учебник, чтобы понять, как работает эта мощная, но сложная и громоздкая вещь: http://frama-c.com/download/value-analysis-Oxygen-20120901.pdf –

+0

Установка была достаточно простой. Я установлен в нужном месте с правами root. И добавил рекомендуемый шрифт. К сожалению, когда я пытаюсь сделать учебник для first.c, он segfaults, размывая всевозможные несчастья в pango. Я избегаю macports, я предполагаю, что в дистрибутиве есть некоторые предположения о наличии этих. Мне, вероятно, легче запустить Linux VM и запустить этот инструмент там, где я себе представляю. –