ошибка сегментации в Unix - возможно повреждение стека - PullRequest
3 голосов
/ 26 февраля 2009

Я смотрю на ядро ​​процесса, запущенного в Unix. Обычно я могу обойтись и получить root-корни, чтобы попытаться выявить проблему с памятью. В этом случае я не уверен, что делать дальше.

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

С некоторыми параметрами указателя связаны следующие параметры: - Не удается получить доступ к памяти по адресу

Может ли это означать какое-либо полное повреждение стека? Я запустил процесс с помощью libumem, и все буферы были отмечены как чистые.

umem_status тоже ничего не сообщил.

так что в основном я в тупике. Каковы вероятные причины? Что я должен искать в коде, поскольку libumem, по-видимому, не сообщил об ошибках.

Какие-нибудь предложения о том, как я могу отладить фурхтер? какие дополнительные функции в MDB я должен рассмотреть?

спасибо.

Ответы [ 5 ]

4 голосов
/ 26 февраля 2009

Повреждение стека звучит как возможность. Несколько вещей, чтобы попробовать:

  • Включите все предупреждения компилятора, которые вы можете!
  • Беги ворс!
  • Если возможно, попробуйте собрать и протестировать вашу программу на OpenBSD, которая имеет много встроенных средств обнаружения повреждения памяти.
  • Если возможно, используйте некоторые инструменты, такие как ProPolice, StackGuard и др.
  • Если вы можете легко воспроизвести эту проблему, стоит поиграть в отладчике. Сузьте это как можно больше, а затем шагните до конца.
3 голосов
/ 26 февраля 2009

Вы можете посмотреть, если использование Valgrind или ElectricFence может сломаться немного раньше для вас.

0 голосов
/ 27 февраля 2009

Я столкнулся с подобной проблемой. Обратный след от GDB не помог. Вальгринд пришел мне на помощь.

Запустите ваше приложение через Valgrind. Определите все ошибки как недопустимые записи. Проанализируйте кусок кода и посмотрите, можно ли его исправить.

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

0 голосов
/ 26 февраля 2009

Ваш код? Когда это происходит со мной, я всегда нахожу одно и то же: нулевой указатель. Выглядит ужасно, когда он падает, но причина в конечном итоге проста.

0 голосов
/ 26 февраля 2009

не должен ли либумем сообщать о том же переполнении, что и электрический забор?

не может легко воспроизвести в тестовой среде, но в коммерческой среде под Unix / Solaris ядро ​​происходит, но libumem ничего плохого не показывает,

...