2012-05-17 2 views
0

Я компилирую программу на удаленном сервере linux. Скомпилирована программа. Однако, когда я запускаю программу, программа резко завершается. Поэтому я отлаживал программу с использованием DDT. Он выплевывает следующую ошибку:Ошибка памяти: нулевой указатель разыменования/несоосность SSE

Process 0: 
    Memory error detected in ClassName::function (filename.cpp:6462). 
    Thread 1 attempted to dereference a null pointer or execute an SSE instruction with an 
    incorrectly aligned memory address (the latter may sometimes occur spuriously if guard 
    pages are enabled) 
    Tip: Use the stack list and the local variables to explore your program's current 
    state and identify the source of the error. 

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

Линия, на которой останавливается программа выглядит следующим образом:

SumUtility = ParaEst[0] + hhincome * ParaEst[71] + IsBlack * ParaEst[61] + IsBachAss * (ParaEst[55]); 

Это в случае переключения.

Эти типы переменных

vector<double> ParaEst; 
    double hhincome; 
    int IsBlack, Is BachAss; 

Спасибо за помощь!

+1

Неверно выровненный адрес памяти вызывает «SIGBUS». Вывод нулевого указателя должен вызывать 'SIGSEGV'. Но информации для ответа на ваш вопрос недостаточно. Выполните команду 'valgrind' или' GDB'. – Anycorn

ответ

2

Это означает, что:

  1. ParaEst является NULL или плохой указатель
  2. отдельные значения массива ParaEst в не выровнены по границам 16 байт, необходимых для SSE.
  3. hhincome, IsBlack или IsBachAss не выровнены по 16-байтовым границам и являются значениями типа SSE.
  4. SumUtility не выровнен по 16-байтам и является полем типа SSE.

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

+0

@Dorgan: Я добавил тип переменной. Одна из причин, по которым я не мог опубликовать значения во время ошибки, состоял в том, что я отлаживаю DDT и, похоже, не отображает содержимое типа «вектор». Он просто показывает, что <выражение не может быть оценено> – sriramn

+0

Учитывая, что вектор должен быть объявлен 16-байтовым, согласованным с какой-либо директивой компилятора. Это должно исправить это для вас. –

0

Хорошо ... Проблема наконец-то была исправлена.

Проблема заключалась в том, что выражение, в котором был разбит код, находилось в новой функции. Однако по какой-то странной причине запуск make-файла не включал эти изменения и все еще компилировался с использованием ранее скомпилированного файла .o. Это привело к тому, что значения мусора были присвоены переменным в этой новой функции. В довершение всего, программа вызывает эту функцию в качестве первого шага. Следовательно, это была систематическая разбивка. Техническим аспектом этого было то, о чем говорил Майкл.

После этого я всегда рекомендую использовать make make в файле make. Проблема, почему запуск файла make не скомпилирует измененный исходный файл, является проблемой, которая, безусловно, требует дальнейшего обсуждения.

Спасибо за ответы !!

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