Ошибка сегментации действительной памяти - PullRequest
0 голосов
/ 18 ноября 2010

Я получаю ошибку сегментации при доступе к объекту, который выглядит действительным и полностью доступным в GDB.Разве сегментация не всегда связана с недоступной памятью?

РЕДАКТИРОВАТЬ: более подробная информация.

Сбой произошел под GDB, чтобы я мог изучить память объекта.Для членов были установлены правильные значения, так что нет никаких шансов, что я получал доступ к постоянной памяти.Инструкция, в которой произошел аварийный отказ, имеет вид Var = Obj.GetMember(), где Var, GetMember и соответствующий член являются короткими целыми числами.Перекос?Я предполагаю, что это вызовет ошибку шины, а не сегментацию.Я постараюсь восстановить все.Проблема в том, что этот фрагмент кода выполняется тысячи раз в секунду, а сегментация происходит один раз в несколько дней.

Ответы [ 4 ]

2 голосов
/ 18 ноября 2010

Попробуйте выполнить полную перестройку (make clean && make), это помогло мне пару раз, когда я столкнулся с такими странными ошибками.

Позднее UPD:

Если это не решит проблему,это обычно означает, что с вашим make-файлом что-то не так, обычно это испорченные зависимости между файлами .cpp и .h, например: a.cpp включает bh, но bh не указан в зависимостях a.cpp.

2 голосов
/ 18 ноября 2010

Вы можете получить ошибки даже при доступе к «действительной» памяти при некоторых обстоятельствах:

  • вы пытаетесь изменить память, но определенное отображение доступно только для чтения
  • вы пытаетесь выполнить код в области памяти, которая не выполняется
  • вы пытаетесь, например, загрузить / сохранить по неверно выровненному адресу, а ваше оборудование выдает исключения выравнивания

Не взглянув на coredump, выяснить, какой была ошибочная инструкция (загрузка / сохранение / выполнение) и какие именно разрешения на отображение для доступной памяти было невозможно различить.

0 голосов
/ 18 ноября 2010

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

0 голосов
/ 18 ноября 2010

В основном да.Использовали ли вы дамп ядра для анализа ошибки сегмента?

...