Как обнаружить ошибки памяти? - PullRequest
1 голос
/ 26 мая 2011

Как определить, вызван ли сбой в работе из-за нехватки памяти?

У меня есть segfault, который не поддается диагностике с помощью valgrind и duma / efence, потому что кажется, что он сам разбивает эти инструменты (Valgrind "невозможное произошло", duma: "mprotect () fail: Cannot выделения памяти")

Приложение (Gazebo) просто аварийно завершает работу с segfault и трассировкой стека, которая, кажется, не предлагает много подсказок о том, почему.

TLDR: Существует ли простой инструмент или метод, позволяющий либо подтвердить, либо исключить состояние нехватки памяти, которое является причиной segfault?

(top не показывает чрезмерное использование памяти перед сбоем)

1 Ответ

5 голосов
/ 26 мая 2011

В Linux состояние нехватки памяти может проявляться одним из двух способов:

  • Если overcommit отключен, вызов brk() или mmap() завершится неудачно с ENOMEM. Вскоре после этого приложение пытается разыменовать указатель NULL, возвращенный из malloc(), и вылетает.
  • Если включен overcommit, то запускается OOM killer и завершает процесс с помощью SIGKILL. Сообщение оставлено в dmesg.

Таким образом, вы можете исключить OOM, проверив, что strace не показывает вызовы brk() или mmap() с ошибками ENOMEM, и убедившись, что в dmesg нет сообщений-убийц OOM.

...