Недопустимая инструкция при программировании C ++ в Linux - PullRequest
5 голосов
/ 13 июня 2010

Моя программа, которая делает то же самое при каждом запуске (перемещает точечный спрайт на расстояние), случайным образом завершится с текстом на терминале «Недопустимая инструкция».Мой поиск в Google нашел людей, сталкивающихся с этим при написании ассемблера, что имеет смысл, потому что ассемблер выдает такие ошибки.

Но почему g ++ генерирует недопустимую инструкцию, подобную этой?Это не то, что я компилирую для Windows, а затем работаю в Linux (что даже тогда, если оба на x86 не должны вызывать AFAIK недопустимую инструкцию).Я выложу основной файл ниже.

Я не могу достоверно воспроизвести ошибку.Хотя, если я сделаю случайные изменения (добавьте пробел здесь, измените константу там), которые заставят перекомпилировать, я могу получить двоичный файл, который не будет работать с Illegal Instruction при каждом запуске, пока я не попытаюсь установить точку останова, которая делаетнезаконное указание «исчезнуть».: (

#include <stdio.h>
#include <stdlib.h> 
#include <GL/gl.h>
#include <GL/glu.h>

#include <SDL/SDL.h>

#include "Screen.h"  //Simple SDL wrapper
#include "Textures.h" //Simple OpenGL texture wrapper 
#include "PointSprites.h" //Simple point sprites wrapper


double counter = 0;
/* Here goes our drawing code */
int drawGLScene()
{
    /* These are to calculate our fps */
    static GLint T0     = 0;
    static GLint Frames = 0;

    /* Move Left 1.5 Units And Into The Screen 6.0 */
    glLoadIdentity();
 glTranslatef(0.0f, 0.0f, -6);
 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);

 glEnable(GL_POINT_SPRITE_ARB);
 glTexEnvi(GL_POINT_SPRITE, GL_COORD_REPLACE, GL_TRUE);
    glBegin( GL_POINTS );   /* Drawing Using Triangles */
 glVertex3d(0.0,0.0, 0);
 glVertex3d(1.0,0.0, 0);
 glVertex3d(1.0,1.0, counter);
 glVertex3d(0.0,1.0, 0);
    glEnd( );                           /* Finished Drawing The Triangle */

    /* Move Right 3 Units */


    /* Draw it to the screen */

    SDL_GL_SwapBuffers( );
    /* Gather our frames per second */
    Frames++;
    {
 GLint t = SDL_GetTicks();
 if (t - T0 >= 50) {
     GLfloat seconds = (t - T0) / 1000.0;
     GLfloat fps = Frames / seconds;
     printf("%d frames in %g seconds = %g FPS\n", Frames, seconds, fps);
     T0 = t;
     Frames = 0;
  counter -= .1;
 }
    }

    return 1;
}

GLuint objectID;
int main( int argc, char **argv )
{
 Screen screen;
 screen.init();
 screen.resize(800,600);


 LoadBMP("./dist/Debug/GNU-Linux-x86/particle.bmp");
 InitPointSprites();


 while(true){drawGLScene();} 
}

Ответы [ 2 ]

17 голосов
/ 13 июня 2010

Компилятор не генерирует недопустимые исключения с вероятностью 99,99%. Почти наверняка происходит то, что в вашей программе есть ошибка, которая заставляет ее либо а) перезаписывать части исполняемого кода мусорными данными, либо б) использовать указатель на функцию, которая указывает на мусор. Попробуйте запустить программу под valgrind для диагностики проблемы - http://valgrind.org/.

0 голосов
/ 19 февраля 2013

Ошибка Illegal Instruction может также быть признаком неисправного драйвера видеокарты или несовпадения с аппаратным обеспечением.Используйте lspci | grep VGA, чтобы подтвердить, какое на самом деле ваше оборудование.Затем попробуйте загрузить последнюю и лучшую версию драйвера для вашей аппаратной модели.

Существует также известная ошибка при запуске кода из NetBeans 6.8 на многоядерной 64-разрядной машине.Код стохастически аварийно завершает работу с нелегальной инструкцией в зависимости от условий гонки в профилировщике.Процент сбоев варьируется от 1% или 5% для некоторого кода, от 30% или 50% до примерно 95% и более, в зависимости от того, какие библиотеки загружаются.Графика и код потоков, кажется, увеличивают это, но вы можете увидеть это с помощью тривиального Hello World main.Если вы получаете 1% -ную частоту сбоев, вы, вероятно, раньше этого не замечали.Решение: запустите исполняемый файл прямо из терминала, если можете.

...