일반적으로 내 프로그래밍 관련 질문은 거의 스스로 풀 수 있지만이 질문은 정말 놀랍습니다.연결할 수없는 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가 사라집니다. 그건 결코 도달하지 못했습니다. 문자열의 인스턴스를 제거하면 충돌이 발생하지 않습니다. 인스턴스화 또는 포함을 바꾸면 도움이되지 않지만 여전히 충돌합니다. 여기
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? 또한 거기에 나를 위해 작동 해결의
디버거에서 코드를 실행하고 그 시간 동안 변수의 값을 보았습니까? 또한,'glXMakeCurrent (0, 0, 0); '에 대한 호출을 변경하면 어떻게 될까? 그리고 조건을'if (false)'로 변경할 때? – omusil