Почему я получаю segfault, так как мое приложение было скомпилировано для 64 бит? - PullRequest
0 голосов
/ 22 марта 2012

Я запускаю приложение (скомпилированное на 64-битной машине) в 64-битной системе Linux (RHEL5.5).Это приложение выходит из строя через каждые 40-50 минут. Я удивлен, увидев это, поскольку оно работало совершенно нормально, когда я выполнял тот же код на 32-разрядной машине.

Одна из возможных причин, которые я обнаружилЭта свободная память в проблемной системе составляла всего 50 МБ. Итак, я предположил, что она выходит из строя из-за нехватки памяти. Но я также увидел, что система имеет около 5 ГБ кэш-памяти. Я предположил, что эта кэш-память должна быть доступна для всех моихЗапросы памяти. Я исправляю это предположение или освобождаю этот кэш через некоторое время, чтобы решить эту проблему.

В системном журнале я видел следующее сообщение, когда мое приложение дает сбой: kernel: MyApplicationName [20655]: segfaultв 0000000030363938 рип 0000000000b35c7e rsp 00000000f322a3a0 ошибка 4

Кто-нибудь может указать, в чем может быть проблема? Что означает эта ошибка 4 в системе.

Ответы [ 2 ]

1 голос
/ 22 марта 2012

Ошибка 4 - EINTR, она в /usr/include/asm-generic/errno-base.h:

#define EINTR            4      /* Interrupted system call */

Но ваша проблема, похоже, не связана с памятью или с этой ошибкой 4 вообще. Скорее всего, это ошибка, возникшая из-за того, что код вашего приложения не был готов для 64-битной системы. Ваша главная проблема не error 4, а segfault.

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

Чтобы получить больше информации об этой ошибке, вы можете скомпилировать ваше приложение с символом отладки, прикрепить gdb к вашему процессу и запросить полную трассировку при возникновении ошибки segfault с этой командой в оболочке gdb thread apply all bt.

0 голосов
/ 22 марта 2012

Кеш будет освобожден при необходимости.Ваша проблема, скорее всего, связана с плохой практикой кода, возможно, ваш код предполагает, что все целые числа 32-битные.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...