2016-11-02 18 views
0

일반적으로 내 프로그래밍 관련 질문은 거의 스스로 풀 수 있지만이 질문은 정말 놀랍습니다.연결할 수없는 glXMakeCurrent가 C++ 응용 프로그램과 충돌 함

그래서 GLX를 사용하는 저수준 OpenGL 응용 프로그램에서 작업 중이며 분할 오류로 인해 충돌이 발생합니다. 나는이 최소한의 예를 아래의 코드를 부러 :

#include <string> 
#include <GL/glx.h> 

int main(int argc, char** argv) 
{ 
    Display* display = NULL; 
    if(display) 
     glXMakeCurrent(display, 0, 0); 
    std::string title("Hello GLX"); 
    return 0; 
} 

나는 내가하는 방식으로 64 비트 리눅스 민트 17.3을 사용하고

g++ -g -o wtf wtf.cpp -lGL 

로 컴파일합니다.

당신이 볼 수 있듯이 아무 것도 의심스럽지 않습니다. 나는 아무 말도하지 않지만, 말했듯이, 충돌합니다 ... 제가 전혀 이해가 안되는 glXMakeCurrent을 주석 처리하면 Segfault가 사라집니다. 그건 결코 도달하지 못했습니다. 문자열의 인스턴스를 제거하면 충돌이 발생하지 않습니다. 인스턴스화 또는 포함을 바꾸면 도움이되지 않지만 여전히 충돌합니다. 여기

은 GDB 역 추적입니다 :

Program received signal SIGSEGV, Segmentation fault. 
0x0000000000000000 in ??() 
(gdb) bt 
#0 0x0000000000000000 in ??() 
#1 0x00007ffff3deb291 in init() at dlerror.c:177 
#2 0x00007ffff3deb6d7 in _dlerror_run ([email protected]=0x7ffff3deb130 <dlsym_doit>, [email protected]=0x7fffffffdc50) 
    at dlerror.c:129 
#3 0x00007ffff3deb198 in __dlsym (handle=<optimized out>, name=<optimized out>) at dlsym.c:70 
#4 0x00007ffff7b4ee1e in ??() from /usr/lib/nvidia-352/libGL.so.1 
#5 0x00007ffff7af9b47 in ??() from /usr/lib/nvidia-352/libGL.so.1 
#6 0x00007ffff7dea0cd in call_init (l=0x7ffff7ff94c0, [email protected]=1, [email protected]=0x7fffffffdda8, 
    [email protected]=0x7fffffffddb8) at dl-init.c:64 
#7 0x00007ffff7dea1f3 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=0x7fffffffdda8, env=0x7fffffffddb8) at dl-init.c:126 
#9 0x00007ffff7ddb30a in _dl_start_user() from /lib64/ld-linux-x86-64.so.2 
#10 0x0000000000000001 in ??() 
#11 0x00007fffffffe101 in ??() 
#12 0x0000000000000000 in ??() 
(gdb) 

과 (확장자 제외) 내 glxinfo 출력

name of display: :0 
display: :0 screen: 0 
direct rendering: Yes 
server glx vendor string: NVIDIA Corporation 
server glx version string: 1.4 
... 
client glx vendor string: NVIDIA Corporation 
client glx version string: 1.4 
... 
GLX version: 1.4 
... 
OpenGL vendor string: NVIDIA Corporation 
OpenGL renderer string: GeForce GTX 560 Ti/PCIe/SSE2 
OpenGL core profile version string: 4.3.0 NVIDIA 352.63 
OpenGL core profile shading language version string: 4.30 NVIDIA via Cg compiler 
OpenGL core profile context flags: (none) 
OpenGL core profile profile mask: core profile 
... 
OpenGL version string: 4.5.0 NVIDIA 352.63 
OpenGL shading language version string: 4.50 NVIDIA 
OpenGL context flags: (none) 
OpenGL profile mask: (none) 

이럴는 전혀 의미가 없기 때문에 내가 정말이 놀란다. 여러분 중 누가 문제가 될 수있는 아이디어가 있습니까? 어떤 호출이 VTable 클래스를 손상시킬 수도 있다고 생각했지만,이 예제에서는 클래스도 없습니다. libGL.so와의 32 비트 대 64 비트 충돌도 아닙니다.

주 기능 시작 부분에 std::cerr << "foo";std::cerr.flush(); (꼭 필요한 것은 아니지만)을 넣을 때 출력이 없으므로 라이브러리를로드 할 때 문제가있는 것 같지만 OpenGL.org/wiki/Tutorial:_OpenGL_3.0_Context_Creation_(GLX)에서 코드를 실행하면 문제가 라이브러리 또는 그래픽 칩이 일부 오류 상태에 있다는 것을 발견 할 수 없습니다 (심지어 재부팅 ... Linux 시스템 ... 그 아이디어에서 나는 방법) Segmentation Fault before main() when using glut, and std::string? 또한 거기에 나를 위해 작동 해결의

+0

디버거에서 코드를 실행하고 그 시간 동안 변수의 값을 보았습니까? 또한,'glXMakeCurrent (0, 0, 0); '에 대한 호출을 변경하면 어떻게 될까? 그리고 조건을'if (false)'로 변경할 때? – omusil

답변

1

중복! 강요 점 libpthread

예를 들어, 연결 수3210
export LD_PRELOAD=/lib/x86_64-linux-gnu/libpthread.so.0 
./wtf 

아직도 내가 직면 한 가장 기괴하고 비논리적 인 문제 중 하나입니다.

+1

민트를 사용 중입니다. 민트는 우분투에서 파생됩니다. 이것은 우분투 버그입니다. 어딘가에 Ubuntu의 빌드 환경 설정에서 Xlib는이 괴괴 망측 한 문제를 일으키는 pthread와 부적절하게 연결되어 있습니다. 그것은 시대에 대한 버그 추적기에 열려있어 분명히 아무도 제대로 그것을 고치려고 귀찮을 수 있습니다. – datenwolf