2010-06-12 14 views
5

Mein Programm, das jedes Mal, wenn es ausgeführt wird, genau dasselbe tut (verschiebt ein Punkt-Sprite in die Ferne), wird zufällig mit dem Text auf dem Terminal 'Illegal Instruction' fehlschlagen. Mein Googeln hat Leute gefunden, die dies beim Schreiben von Assembly kennen, was Sinn macht, weil die Assembly diese Art von Fehlern auslöst.Unzulässiger Befehl beim Programmieren von C++ unter Linux

Aber wieso würde g ++ eine illegale Anweisung wie diese erzeugen? Es ist nicht so, als kompiliere ich für Windows, dann laufe ich unter Linux (was auch dann, solange beide auf x86 sind, sollte AFAIK keine Illegal Instruction verursachen). Ich werde die Hauptdatei unten posten.

Ich kann den Fehler nicht zuverlässig reproduzieren. Obwohl, wenn ich zufällige Änderungen mache (fügen Sie hier ein Leerzeichen ein, ändern Sie eine Konstante dort), die eine Neukompilierung erzwingen, kann ich eine Binärdatei erhalten, die mit Illegal Instruction jedes Mal, wenn es ausgeführt wird, fehlschlägt, bis ich versuche, einen Haltepunkt zu setzen illegaler Unterricht 'verschwinden'. :(

#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();} 
} 
+1

Ich würde empfehlen, die fehlerhaften Speichermodule zu ersetzen. – avakar

+3

Ich würde vorschlagen, den fehlerhaften Kommentar Autor zu ersetzen. –

+2

Führen Sie Ihren Code unter Gdb und dann, wenn Sie die Ausnahme erhalten eine Backtrace (BT). –

Antwort

17

Der Compiler ist illegal Ausnahmen nicht zu erzeugen, mit 99,99% Wahrscheinlichkeit. Fast sicher, was passiert ist, dass Sie einen Fehler in Ihrem Programm haben, die es verursacht, entweder a) Teile des ausführbaren Code zu überschreiben mit Mülldaten, oder b) benutze einen Funktionszeiger, der in den Müll zeigt. Versuchen Sie, Ihr Programm unter valgrind auszuführen, um das Problem zu diagnostizieren - http://valgrind.org/.

+2

Eine Variante von (b), auf die in C++ geachtet werden muss, ist das Aufrufen einer virtuellen Funktion für ein Objekt, das irgendwie überschrieben wurde. –

+2

Ich würde nicht sagen "99,99% Wahrscheinlichkeit". Es ist ziemlich einfach, einen Compiler zu bekommen, der illegale Befehle ausgibt. Wenn Sie dem Compiler mitteilen, dass es in Ordnung ist, AVX2-Anweisungen zu verwenden, und Ihre CPU diese nicht besitzt, stoppt die Ausführung der ersten AVX2-Anweisung Ihr Programm mit dieser "Illegal Instruction" – MSalters

0

Der Fehler "Illegal Instruction" kann auch ein Symptom für einen fehlerhaften Grafikkartentreiber sein, oder einen Fehler, der nicht mit der Hardware übereinstimmt. Verwenden Sie lspci | grep VGA, um zu bestätigen, was Ihre Hardware tatsächlich ist. Versuchen Sie dann, den neuesten & größten Treiber für Ihr Hardwaremodell herunterzuladen.

Es gibt auch einen bekannten Fehler beim Ausführen von Code aus NetBeans 6.8 auf einem 64-Bit-Multicore-Computer. Der Code stürzt stochastisch mit Illegal Instruction ab, basierend auf den Race Conditions im Profiler. Prozent der Abstürze variieren von 1% oder 5% für einen Code, 30% oder 50%, bis zu etwa 95% +, je nachdem, welche Bibliotheken geladen werden. Grafik- und Thread-Code scheint dies zu erhöhen, aber Sie können es mit einem trivialen Hello World-Haupt sehen. Wenn Sie eine Absturzrate von 1% erhalten, haben Sie dies wahrscheinlich noch nicht bemerkt. Lösung: Führen Sie die ausführbare Datei direkt von einem Terminal aus, wenn Sie können.