Su Ubuntu 14.04 LTS a 64 bit, sto provando a compilare un semplice programma OpenGL che usa il glut. Ricevo un errore di segmentazione (SIGSEV) prima che qualsiasi linea di codice venga eseguita in main; anche su un programma di test molto ridotto. Cosa potrebbe causare questo?Errore di segmentazione prima di main() quando si usa glut e std :: string?
La mia linea di comando:
g ++ -Wall -g main.cpp -lglut -lGL -lGLU -o principale
mio semplice caso di test:
#include <GL/gl.h>
#include <GL/glu.h>
#include <GL/glut.h>
#include <string>
#include <cstdio>
int main(int argc, char** argv){
printf("Started\n");
std::string dummy = "hello";
glutInit(&argc, argv);
return 0;
}
Quando eseguo il programma , il printf all'inizio del main non può essere eseguito prima del segfault. Sotto GDB, ho questa traccia indietro dopo la segfault è
#0 0x0000000000000000 in ??()
#1 0x00007ffff3488291 in init() at dlerror.c:177
#2 0x00007ffff34886d7 in _dlerror_run ([email protected]=0x7ffff3488130 <dlsym_doit>, [email protected]=0x7fffffffddf0) at dlerror.c:129
#3 0x00007ffff3488198 in __dlsym (handle=<optimized out>, name=<optimized out>) at dlsym.c:70
#4 0x00007ffff702628e in ??() from /usr/lib/nvidia-352/libGL.so.1
#5 0x00007ffff6fd1aa7 in ??() from /usr/lib/nvidia-352/libGL.so.1
#6 0x00007ffff7dea0fd in call_init (l=0x7ffff7fd39c8, [email protected]=1, [email protected]=0x7fffffffdf48, [email protected]=0x7fffffffdf58) at dl-init.c:64
#7 0x00007ffff7dea223 in call_init (env=<optimized out>, argv=<optimized out>, argc=<optimized out>, l=<optimized out>) at dl-init.c:36
#8 _dl_init (main_map=0x7ffff7ffe1c8, argc=1, argv=0x7fffffffdf48, env=0x7fffffffdf58) at dl-init.c:126
#9 0x00007ffff7ddb30a in _dl_start_user() from /lib64/ld-linux-x86-64.so.2
#10 0x0000000000000001 in ??()
#11 0x00007fffffffe2ba in ??()
#12 0x0000000000000000 in ??()
Ed ecco il kicker. Se commento o o la riga gluInit o la riga fittizia std :: string, il programma viene compilato ed eseguito correttamente. Fino a quando non ho notato questo, ho pensato che ci fosse qualcosa di sbagliato nel mio GLUT (anche se ho provato il programma originale su cui sto eseguendo il debugging (che ho ridotto a questo esempio)) diversi sistemi senza successo. Sono un po 'in perdita qui.
Modifica: ho provato i suggerimenti di gmbeard. Turining off optimizations (-O0) non ha modificato nulla sul callstack prodotto da gdb.
ldd sul programma in esecuzione mi dà:
linux-vdso.so.1 => (0x00007ffe3b7f1000)
libglut.so.3 => /usr/lib/x86_64-linux-gnu/libglut.so.3 (0x00007f04978fa000)
libstdc++.so.6 => /usr/lib/x86_64-linux-gnu/libstdc++.so.6 (0x00007f04975f6000)
libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00007f04973e0000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f049701b000)
libGL.so.1 => /usr/lib/nvidia-352/libGL.so.1 (0x00007f0496cec000)
libX11.so.6 => /usr/lib/x86_64-linux-gnu/libX11.so.6 (0x00007f04969b7000)
libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007f04966b1000)
libXi.so.6 => /usr/lib/x86_64-linux-gnu/libXi.so.6 (0x00007f04964a1000)
libXxf86vm.so.1 => /usr/lib/x86_64-linux-gnu/libXxf86vm.so.1 (0x00007f049629b000)
/lib64/ld-linux-x86-64.so.2 (0x00007f0497b44000)
libnvidia-tls.so.352.21 => /usr/lib/nvidia-352/tls/libnvidia-tls.so.352.21 (0x00007f0496098000)
libnvidia-glcore.so.352.21 => /usr/lib/nvidia-352/libnvidia-glcore.so.352.21 (0x00007f0493607000)
libXext.so.6 => /usr/lib/x86_64-linux-gnu/libXext.so.6 (0x00007f04933f5000)
libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007f04931f1000)
libxcb.so.1 => /usr/lib/x86_64-linux-gnu/libxcb.so.1 (0x00007f0492fd2000)
libXau.so.6 => /usr/lib/x86_64-linux-gnu/libXau.so.6 (0x00007f0492dce000)
libXdmcp.so.6 => /usr/lib/x86_64-linux-gnu/libXdmcp.so.6 (0x00007f0492bc8000)
E poi, dopo aver individuato quale libGL sto usando, mi sono imbattuto su di esso LDD
linux-vdso.so.1 => (0x00007ffc55df8000)
libnvidia-tls.so.352.21 => /usr/lib/nvidia-352/tls/libnvidia-tls.so.352.21 (0x00007faa60d83000)
libnvidia-glcore.so.352.21 => /usr/lib/nvidia-352/libnvidia-glcore.so.352.21 (0x00007faa5e2f2000)
libX11.so.6 => /usr/lib/x86_64-linux-gnu/libX11.so.6 (0x00007faa5dfbd000)
libXext.so.6 => /usr/lib/x86_64-linux-gnu/libXext.so.6 (0x00007faa5ddab000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007faa5d9e6000)
libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007faa5d7e2000)
libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007faa5d4dc000)
libxcb.so.1 => /usr/lib/x86_64-linux-gnu/libxcb.so.1 (0x00007faa5d2bd000)
/lib64/ld-linux-x86-64.so.2 (0x00007faa612b5000)
libXau.so.6 => /usr/lib/x86_64-linux-gnu/libXau.so.6 (0x00007faa5d0b9000)
libXdmcp.so.6 => /usr/lib/x86_64-linux-gnu/libXdmcp.so.6 (0x00007faa5ceb3000)
Ma una rapida occhiata non rivela qualcosa di sbagliato
Penso che sia perché non passi alcun arg try prova ad aggiungere quelle linee befaure alla printf 'argc = 1; argv [0] = "test"; 'scusa non posso provarlo perché sono in treno. – Mido
Nah, si rompe ancora se passo Args da riga di comando. Dal momento che si blocca prima che anche main sia in esecuzione, ciò non avrebbe comunque molto senso. – MikeMx7f
Prova 'LD_DEBUG = all./Main' o' LD_DEBUG = tutto LD_DEBUG_OUTPUT = log.txt./Main'. Forse può spiegare cosa sta facendo 'ld.so' prima di andare in crash. –