2014-10-20 3 views
1

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

После некоторых исследований в Интернете все еще неясно, что означает «ловушка выравнивания». Может ли кто-нибудь дать объяснение, уделяя особое внимание тому, что обычно вызывает ловушки выравнивания, и как обычно можно решить проблему (не только в том, как использовать отладчик, но и сама проблема)?

Все это сделано в коде C в процессоре ARM (OMAP L138) с встроенным Linux.

ПРИМЕЧАНИЕ: Я не пытаюсь получить предложение об ошибке с этим ответом, но, как следует из названия вопроса, понимание того, что означает ошибка «выравнивания ловушки». Вот почему я не планирую размещать исходный код и т. П.

+1

Пожалуйста, добавьте код, определяющий структуру и функцию доступа. – user694733

+0

@ user694733 Ну, я не уверен, не изменит ли он эту тему. Я не ищу решение, связанное с ошибкой, с этим вопросом, но чтобы понять общую идею о том, что означает «ловушка выравнивания» и как обычно она будет решена (ответ, предоставленный Базиле, говорит именно то, что я имел в виду ответ на этот вопрос). Я только упомянул о структуре, чтобы немного сузить область действия после прочтения ответа Базиля и заметить, что это довольно широкая ошибка. – Momergil

+1

Достаточно честный. Ответы Basiles в значительной степени покрывают его. Лично я бы сначала исследовал любые приведения указателей, которые могли бы скрывать предупреждения/ошибки компилятора. Это пахнет наивным кодом десериализации. – user694733

ответ

7

Это конкретная операционная система и процессор (и ABI).

У вас есть некоторые memory corruption или memory leak или buffer overflow, и т.д ..., или вы разыменование плохого указателя (либо неинициализированный или вычисляться неправильно) - например, указатель на double, который не является кратным 8 (или, на некоторых архитектурах, указателем на int, который не кратен 4), или, возможно, вы переходите на какой-то недействительный адрес (например, на плохой указатель функции).

В Linux я предлагаю скомпилировать с gcc -Wall -g и использовать отладчик (gdb) и valgrind. Вам может быть интересно использовать -fsanitize=address или -fsanitize=undefined флаговые компиляции (с GCC 4.9). Они оба инструмента (так изменяют) сгенерированный код.

Подробнее о undefined behavior. У тебя наверняка есть.

Смежные вопросы