2010-09-21 5 views
3

Je viens de commencer à essayer d'utiliser OpenGL en C++ pour une classe (je l'ai déjà utilisé dans Java en quantité). Et j'ai commencé à essayer d'écrire quelque chose de substantiel, je ne pouvais pas obtenir cela pour arrêter Seg faute donc j'ai écrit ce petit morceau de code qui est presque une ligne pour la copie en ligne d'un exemple dans le premier chapitre du livre rouge. Il fautes également Seg. Ma question est pourquoi. J'ai essayé à la fois éclipse, et netbeans, j'ai la bibliothèque glut.h liée dans mes projets dans les deux, je cours 64 bits ubuntu 10.4, sur une machine virtuelle en utilisant VMWare, gcc et freeglut sont tous les deux installés, Netbeans et eclipse exécuter du code C++ normal (non OpenGL) que j'écris sans erreur de segmentation.Un simple code OpenGL provoque toujours une erreur de segmentation (C++ sur Ubuntu, machine virtuelle)

est ici le code Quoi qu'il en soit:

#include <stdlib.h> 
#include <GL/freeglut.h> 
#include <stdio.h> 

void init(){ 
    glClearColor(0.0, 0.0, 0.0, 0.0); 
    glMatrixMode(GL_PROJECTION); 
    glLoadIdentity(); 
    glOrtho(0.0, 1.0, 0.0, 1.0, -1.0, 1.0); 

} 
void display(){ 
    glClear(GL_COLOR_BUFFER_BIT); 
    glColor3f(1.0,1.0,1.0); 
    glBegin(GL_POLYGON); 
     glVertex3f(0.25, 0.25, 0.0); 
     glVertex3f(0.75,0.25,0.0); 
     glVertex3f(0.75,0.75, 0.0); 
     glVertex3f(0.25, 0.75, 0.0); 
     glEnd(); 
    glFlush(); 
} 
int main(int argc, char** argv) { 
    glutInit(&argc, argv); 
    glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB); 
    glutInitWindowSize(250,250); //if I comment out this line, 
    glutInitWindowPosition(100,100); 
    glutCreateWindow(argv[0]); //this line, 
    init(); //this line and the glut main loop line it runs without any errors, but why wouldn't it? It's not doing anything now! 
    glutDisplayFunc(display); 
    glutMainLoop(); //if I comment out just this line I get illegal instruction instead of segfault but I need this line 
    return 0; 
} 

Thread [1] 28944 (Suspended : Signal : SIGSEGV:Segmentation fault)
XF86DRIQueryVersion() at 0x7ffff7e7412e XF86DRIQueryExtension() at 0x7ffff7e742c9 0x7ffff7e73c70 0x7ffff7e53ff8 glXGetFBConfigs() at 0x7ffff7e4c71e glXChooseFBConfigSGIX() at 0x7ffff7e4cd97
fgChooseFBConfig() at freeglut_window.c:205 0x7ffff794a8c7
fgOpenWindow() at freeglut_window.c:768 0x7ffff794aac8
fgCreateWindow() at freeglut_structure.c:106 0x7ffff7948f62 glutCreateWindow() at freeglut_window.c:1,183 0x7ffff794a2a2 main() at Thread [1] 28944 (Suspended : Signal : SIGSEGV:Segmentation fault) XF86DRIQueryVersion() at 0x7ffff7e7412e XF86DRIQueryExtension() at 0x7ffff7e742c9 0x7ffff7e73c70 0x7ffff7e53ff8 glXGetFBConfigs() at 0x7ffff7e4c71e glXChooseFBConfigSGIX() at 0x7ffff7e4cd97
fgChooseFBConfig() at freeglut_window.c:205 0x7ffff794a8c7
fgOpenWindow() at freeglut_window.c:768 0x7ffff794aac8
fgCreateWindow() at freeglut_structure.c:106 0x7ffff7948f62 glutCreateWindow() at freeglut_window.c:1,183 0x7ffff794a2a2 main() at (project stuff here):54 0x40100b

+0

Je ne suis pas sûr que l'édition de l'OpenGL du titre aidera beaucoup BioBuckyBall, comme je l'ai spécifié Ubuntu ne se fâche pas avec le code C++ de base uniquement lorsque j'inclue des éléments OpenGL. Donc, même si vous avez simplifié le titre, vous l'avez également rendu moins précis. – will

+0

Quelle est la trace de la pile où le segfault se produit? Avez-vous vérifié 'glGetError()'? –

+0

D'autres codes OpenGL s'exécutent-ils dans la même machine virtuelle? Quelle est la sortie de glxinfo? –

Répondre

2

Avez-vous l'accélération matérielle dans la machine virtuelle? Vérifiez en utilisant glxinfo. Le crash dans le DRI suggère que vous ne le faites pas.

+0

nom de l'affichage:: 0.0 Erreur de segmentation tout ce que glxinfo me dit – will

+0

J'ai apparemment accéléré les graphiques 3D vérifiés dans les paramètres de la machine virtuelle, donc je pense que je fais? – will

+0

La machine virtuelle peut avoir une accélération matérielle, mais vous avez besoin de vos pilotes installés dans le système d'exploitation à l'intérieur de la machine virtuelle. –

1

Mon intuition est que si vous compilez l'exemple épuré suivant, vous aurez toujours une erreur de segmentation:

#include <stdlib.h> 
#include <GL/freeglut.h> 
#include <stdio.h> 

int main(int argc, char** argv) { 
    glutInit(&argc, argv); 
    glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB); 
    glutInitWindowSize(250,250); 
    glutInitWindowPosition(100,100); 
    glutCreateWindow("test window"); 
    return 0; 
} 

Parce que votre erreur de segmentation se produit dans:

fgCreateWindow() at freeglut_structure.c:106 0x7ffff7948f62 glutCreateWindow() 

Dans d'autres mots, il ne peut pas créer une fenêtre (peu importe ce qu'il y a dedans). Ma conjecture, à l'instar de ce que @Matias a répondu est que vous devez activer l'accélération 3D dans votre machine virtuelle? Mais ce pourrait être un problème de pilote d'affichage, 32 vs 64 bits, ou quelque chose de légèrement plus sinistre, comme un désaccord entre freeglut & votre version d'OpenGl - d'où mon précédent barrage de questions. Pourriez-vous re-compiler cette version réduite et afficher les résultats?

+0

Oui, encore segfaults – will

+0

Ahh - et je vois de vos commentaires que vous utilisez Ubuntu 10.04 x64 dans MS Virtual PC à partir de Win 7 x64? Je suppose qu'il s'agit d'une autre instance des bogues liés à la façon dont ils ont changé les pilotes d'affichage de chargement dans Windows 7. Avez-vous modifié les paramètres de démarrage pour l'installation - comme "noreplace-paravirt"? Voir par exemple http://ubuntuforums.org/showthread.php?t=1466888 ou http://nemesisv.blogspot.com/2009/04/installing-ubuntu-904-on-microsoft.html –

3

pourrait aider: ajouter GLUT_DEPTH dans glutInitDisplayMode Works pour moi avec ce drapeau, et non sans (segfault à glutCreateWindow)

2

J'ai eu un problème similaire avec code différent, et en utilisant Debian 6.0 à distance de Mac OS X 10.6. La machine en question utilisait une carte Radeon HD 5670 (bien que cela ne soit pas pertinent).

En y regardant de plus près, il semblait que quelque chose avec OpenGL ne fonctionnait pas correctement, car ce n'était pas seulement mon code qui avait échoué.

Certains des symptômes que je rencontrais comprennent:

  • Les programmes utilisant accident OpenGL avec SIGSEGV à XF86DRIQueryVersion()
  • glxinfo/glxgears accidents avec SIGSEGV et

Pour moi, la solution était pour supprimer le pilote Radeon fglrx (supprimez tous les paquets avec aptitude) et installez le pilote 'radeon' à la place. Ensuite, lancez 'sudo Xorg -configure' pour générer une nouvelle configuration, testez-la avec 'sudo X -config /root/xorg.conf.new' et copiez-la dans votre emplacement xorg.conf par défaut.

Après que les programmes ne plantent avec SIGSEGV plus, même si je suis une autre erreur:

  • glxinfo donne: Got Erreur: n'a pas pu trouver RGB GLX visuel ou fbconfig
  • glxgears donne: Erreur: impossible d'obtenir un visuel RVB à double tampon

Cela semble être lié au rendu direct (DRI), source de problèmes. Une solution à ce problème était de désactiver le rendu direct en définissant 'export LIBGL_ALWAYS_INDIRECT = yes'. Une alternative consiste à supprimer la bibliothèque utilisée pour DRI (dans mon cas, c'était libgl1-mesa-dri).

Je ne suis toujours pas convaincu qu'il s'agit de la solution complète , car les pilotes fglxr ne devraient pas avoir d'importance si vous utilisez uniquement glxinfo et glxgears depuis un terminal distant. Je soupçonne que la suppression de fglxr et l'installation de radeon ont résolu quelque chose dans la configuration.

Quelques références que j'ai utilisé comprennent:

+0

Il semble que les erreurs sont lié aux graphiques transférés sur un tunnel SSH (de Mac OS X à Debian 6.0 dans mon cas) qui cause des problèmes. Lors de l'utilisation du rendu "direct", cela donne le second jeu d'erreurs, en utilisant le rendu "indirect", les programmes opengl fonctionnent à nouveau. Aussi: lancer glxinfo | grep "chaîne de rendu" donne le matériel VGA dans mon Mac, pas la machine distante. Voir http://unix.stackexchange.com/questions/1437/what-does-libgl-always-indirect-1-actually-do aussi. – Tim

Questions connexes