2010-06-12 8 views
5
पर

मेरे कार्यक्रम है, जो बिल्कुल वही बात हर बार इसे चलाता (दूरी में एक बिंदु स्प्राइट चलता है) बेतरतीब ढंग से टर्मिनल 'अवैध निर्देश' पर पाठ के साथ असफल हो जायेगी करता है। मेरे गुगल ने लोगों को यह महसूस किया है कि असेंबली लिखते समय यह समझ में आता है क्योंकि असेंबली उन प्रकार की त्रुटियों को फेंकता है।अवैध निर्देश ++ जब सी प्रोग्रामिंग लिनक्स

लेकिन क्यों जी ++ इस तरह एक अवैध अनुदेश पैदा होगा? ऐसा नहीं है कि मैं विंडोज के लिए संकलन कर रहा हूं और फिर लिनक्स पर चल रहा हूं (जो तब तक, जब तक कि दोनों x86 पर हैं, AFAIK को अवैध निर्देश नहीं देना चाहिए)। मैं नीचे मुख्य फाइल पोस्ट करूंगा।

मैं मज़बूती से त्रुटि पुन: पेश नहीं कर सकते। हालांकि, अगर मैं यादृच्छिक परिवर्तन करता हूं (यहां एक जगह जोड़ें, वहां स्थिर रहें) जो एक पुनर्मूल्यांकन को मजबूर करता है, मैं एक बाइनरी प्राप्त कर सकता हूं जो अवैध निर्देश के साथ असफल हो जाता है, जब तक कि मैं ब्रेक पॉइंट सेट करने की कोशिश नहीं करता, जो कि बनाता है अवैध निर्देश 'गायब'। :(

#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

मैं दोषपूर्ण स्मृति मॉड्यूल की जगह सुझाव है। – avakar

+3

मैं दोषपूर्ण टिप्पणी लेखक को बदलने का सुझाव दूंगा। –

+2

जीडीबी के तहत अपना कोड चलाएं और फिर जब आप अपवाद प्राप्त करते हैं तो बैकट्रैक (बीटी) करें। –

उत्तर

17

संकलक अवैध अपवाद नहीं पैदा कर रहा, 99.99% संभावना के साथ। लगभग पूर्ण रूप से क्या हो रहा है कि आप जो यह या तो एक) अपने निष्पादन योग्य कोड के कुछ हिस्सों को ओवरराइट करना खड़ी कर रहा है अपने प्रोग्राम में बग है कचरा डेटा के साथ, या बी) एक फ़ंक्शन पॉइंटर का उपयोग करें जो कचरे में इंगित करता है। समस्या का निदान करने के लिए अपने कार्यक्रम को वालग्रिंड के तहत चलाने का प्रयास करें - http://valgrind.org/

+2

सी ++ में देखने के लिए (बी) का एक संस्करण किसी ऑब्जेक्ट पर वर्चुअल फ़ंक्शन को कॉल कर रहा है जिसे किसी भी तरह ओवरराइट किया गया है। –

+2

मैं "99.99% संभावना" नहीं कहूंगा। अवैध निर्देशों को छोड़ने के लिए एक कंपाइलर प्राप्त करना काफी आसान है, बस अपने सीपीयू के बारे में झूठ बोलें। यदि आप कंपाइलर को बताते हैं कि AVX2 निर्देशों का उपयोग करना ठीक है, और आपके सीपीयू में वास्तव में उन्हें नहीं है, तो पहले AVX2 निर्देश को निष्पादित करने से आपके प्रोग्राम को "अवैध निर्देश" – MSalters

0

अवैध निर्देश बग भी एक दोषपूर्ण ग्राफ़िक्स कार्ड ड्राइवर का एक लक्षण है, या एक है कि हार्डवेयर के लिए बेमेल है हो सकता है। वास्तव में आपका हार्डवेयर क्या है इसकी पुष्टि करने के लिए lspci | grep VGA का उपयोग करें। फिर अपने हार्डवेयर मॉडल के लिए नवीनतम & सबसे बड़ा ड्राइवर डाउनलोड करने का प्रयास करें। जब एक मल्टी कोर 64-बिट मशीन पर NetBeans 6.8 अंदर से कोड चल रहा

वहाँ भी एक ज्ञात बग है। कोड प्रोफाइलर में दौड़ की स्थिति के आधार पर अवैध निर्देश के साथ stochastically दुर्घटनाग्रस्त हो जाता है। क्रैश का प्रतिशत कुछ कोड के लिए 1% या 5% से भिन्न होता है, 30% या 50%, लगभग 95% + तक, जो पुस्तकालयों को लोड किया जा रहा है, के आधार पर। ग्राफिक्स और थ्रेड्स कोड इसे बढ़ाने के लिए प्रतीत होता है, लेकिन आप इसे एक छोटे से हैलो वर्ल्ड मुख्य के साथ देख सकते हैं। यदि आपको 1% क्रैश दर मिलती है, तो आपने शायद इसे पहले नहीं देखा है। समाधान: अगर आप कर सकते हैं तो निष्पादन योग्य टर्मिनल से सीधे चलाएं।

संबंधित मुद्दे