LINUX.ORG.RU

Креш при одновременном использовании GLX и std::shared_ptr

 , ,


0

2

Имею следующий простейший код:

#include <GL/gl.h>
#include <GL/glx.h>
#include <cstdio>
#include <cstdlib>

#include <memory>

class T {
public:
};

int main()
{
	printf( "1\n" );
	glXSwapBuffers( 0, 0 );
	printf( "2\n" );
	std::make_shared<T>();
	printf( "3\n" );

	return( 0 );
}

Компиляция:

g++ -std=c++0x main.cpp -lGL -lGLU

Но при вызове ./a.out получаю Segmentation fault (core dumped) еще на этапе загрузки бинарника в память, то есть нет даже вызовa какого либо метода:

home@dev:~/test$ ./a.out 
Segmentation fault (core dumped)

Если закомментировать какой либо вызов - код будет загружаться и работать. Как отдельно создание shared_ptr так и вызов glx.

В чем может быть проблема? И как ее фиксить? Надо для написания велосипеда (just for fun), и понять причину такого креша для избежания в будущем.



Последнее исправление: chak (всего исправлений: 1)

коротко-проблема в твоем радеоне

более подробно-я уже писал,да и не я только-любой кто писал хоть простейший «opengl» рендер хоть для тетриса или вывода одной картинки-прекрасно знает какое радеон г-но
для неверующих я привел простой пример-берем любой(кроме первых пяти они слишком простые) «пример» из уроков «nehe» ссылку даже давал
и пытаемся запустить этот «эталонный» код на радеоне....да не будет работать и понадобитьс даже в таком простом коде делать костыль для радеона
и самое забавное что на ФАКТЫ о кривущем неработающем радеоне вот уже 20 лет-никто не читает и не комментирует
даже на этот мой пост или даже на эту тему ниодин фанатик радеона не ответит

а вот как вмассовом экстазе учавствовать-«радеон лучший все работает нвидиягл во всем виновата» так у них тут целая секта

anonymous
()

на нвидии работает,проверил

на радеоне-как повезет

anonymous
()
Ответ на: комментарий от chak

У меня почему то, твой код тоже лечится

 
demidrol@home ~/Projects $ g++ -std=c++0x testGLX.cpp -lGL -lGLU
demidrol@home ~/Projects $ ./a.out 
Segmentation fault
demidrol@home ~/Projects $ g++ -std=c++0x testGLX.cpp -lGL -lGLU -lpthread
demidrol@home ~/Projects $ ./a.out 
1
2
3
demidrol@home ~/Projects $ 
DemiDroL
()
Ответ на: комментарий от DemiDroL

Помогло int i=pthread_getconcurrency(); и -lpthread. Более кривого и странного костыля я еще не встречал....

chak
() автор топика
Ответ на: комментарий от DemiDroL

У меня не вылечился

home@dev:~/test$ g++ -std=c++0x main.cpp -lGL -lGLU -lpthread
home@dev:~/test$ ./a.out 
Segmentation fault (core dumped)

Но вылечился явным вызовом pthread (пост ниже\выше)

chak
() автор топика

Наркоман, с чего ты взял, что этот код вообще должен работать? По документации на glXSwapBuffers видно, что как минимум первый параметр - это указатель, причём не сказано, что 0 - это валидное значение этого указателя. Если запустить этот твой говнокод под отладчиком или valgrind'ом, то можно увидеть как что-то внутри иксовых либ при вызове glXSwapBuffers() пытается читать из начала адресного пространства, что очень похоже на 0 + смещение в какой-то очень большой струкруте.

Deleted
()
Ответ на: комментарий от Deleted

Выдохни и прочти внимательно

Но при вызове ./a.out получаю Segmentation fault (core dumped) еще на этапе загрузки бинарника в память
chak
() автор топика
Ответ на: комментарий от chak

Без разницы что там, какие значения, какой мусор передается, ошибка еще при инициализации самого процесса и системных либ.

chak
() автор топика
Ответ на: комментарий от DemiDroL

Ок, спасибо, гляну этими утилитами

chak
() автор топика
Ответ на: комментарий от Deleted

printf не срабатывает до вызова glx функции. А использование pthread похоже что подперло костылем эту проблему.

chak
() автор топика
Ответ на: комментарий от chak

printf не срабатывает до вызова glx функции. А использование pthread похоже что подперло костылем эту проблему.

Ты уверен, что у тебя нигде буферизация stdout не включена?

Deleted
()
Ответ на: комментарий от DemiDroL

Вторая ссылка не в тему, но ок, верю. Но это не отменяет тот факт, что код из первого поста работать в принципе не должен.

Deleted
()
Последнее исправление: Deleted (всего исправлений: 1)
Ответ на: комментарий от Deleted

Но он должен запуститься. Это была идея. Почему не запускается, а не почему не работает. Это большая разница.

chak
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.