Russian Qt Forum

Программирование => Общий => Тема начата: __Heaven__ от Март 31, 2015, 19:40



Название: Программа валится, если не прицепить отладчик
Отправлено: __Heaven__ от Март 31, 2015, 19:40
Привет друзья!
Использую win 8 x64, Qt 5.4.1 mingw x64

Сборку произвожу с конфигурацией debug. При сборке по ctrl+r (без отладчика) у меня происходит запуск и сразу же вылет - стандартный диалог винды "Прекращена работа программы...."
Цитировать
Сигнатура проблемы:
  Имя события проблемы:   APPCRASH
  Имя приложения:   Master.exe
  Версия приложения:   0.0.0.0
  Отметка времени приложения:   00000000
  Имя модуля с ошибкой:   nvoglv32.DLL
  Версия модуля с ошибкой:   9.18.13.4752
  Отметка времени модуля с ошибкой:   54d3aed2
  Код исключения:   c0000005
  Смещение исключения:   00922a70
  Версия ОС:   6.3.9600.2.0.0.256.48
  Код языка:   1049
  Дополнительные сведения 1:   5861
  Дополнительные сведения 2:   5861822e1919d7c014bbb064c64908b2
  Дополнительные сведения 3:   a10f
  Дополнительные сведения 4:   a10ff7d2bb2516fdc753f9c34fc3b069

Ознакомьтесь с заявлением о конфиденциальности в Интернете:
  http://go.microsoft.com/fwlink/?linkid=280262

Если заявление о конфиденциальности в Интернете недоступно, ознакомьтесь с его локальным вариантом:
  C:\Windows\system32\ru-RU\erofflps.txt
Запускаясь по F5 (с отладчиком) - всё ок.
Мне бы понять, где я в коде накосячил...
Пока что, глядя на nvoglv32.DLL, понимаю, что где-то в части OpenGL


Название: Re: Программа валится, если не прицепить отладчик
Отправлено: Old от Март 31, 2015, 19:47
Где то не инициализировали переменные - указатели.


Название: Re: Программа валится, если не прицепить отладчик
Отправлено: Igors от Март 31, 2015, 19:56
Можно попробовать скомпилить с отладчиком и с оптимизацией (напр в MSVC такая возможность есть). Иначе или лог или совать в код прямой вызов debug. И то и другое не сладко и не быстро. Лучше всего применить тул (только что отписался в др теме) - но его "надо изыскивать"


Название: Re: Программа валится, если не прицепить отладчик
Отправлено: __Heaven__ от Март 31, 2015, 20:02
Да что-то проблема с этим msvc. Наверное, потому что я решил пытаться работать в community версии. Потом вернусь к нему.
Проблему решил. Для этого пришлось покататься по коммитам, а потом комментируя блоки кода установил, что проблема была в
Код
C++ (Qt)
QOpenGLBuffer::allocate
Я ей передавал указатель на массив данных в памяти и их количество. Количество превышало фактическое.
Не понимаю, почему мне valgrind не ругнулся, да и почему валится... Ну, брал бы себе совершенно левые значения, да и отрисовывал бы (как он это делает с прикреплённым отладчиком)


Название: Re: Программа валится, если не прицепить отладчик
Отправлено: Bepec от Март 31, 2015, 20:19
Видимо брал одновременно с тем, чьи данные там лежали. Вот и конфликт интересов :D


Название: Re: Программа валится, если не прицепить отладчик
Отправлено: __Heaven__ от Март 31, 2015, 20:21
Видимо брал одновременно с тем, чьи данные там лежали. Вот и конфликт интересов :D
Не понимаю. Смотреть запрещено каким-то образом?


Название: Re: Программа валится, если не прицепить отладчик
Отправлено: Igors от Апрель 01, 2015, 08:18
..., да и почему валится... Ну, брал бы себе совершенно левые значения, да и отрисовывал бы (как он это делает с прикреплённым отладчиком)
Они могут оказаться за пределами распределенной приложением памяти


Название: Re: Программа валится, если не прицепить отладчик
Отправлено: __Heaven__ от Апрель 01, 2015, 09:33
А как же обнуление при переполнении? Растолкуйте, пожалуйста.


Название: Re: Программа валится, если не прицепить отладчик
Отправлено: Bepec от Апрель 01, 2015, 09:57
Если честно в этой области теория у меня хромает на все три ноги, но поправьте меня если я не прав. (заодно подкачаю)

читать одновременно одну и ту же область памяти из разных потоков нельзя?
Почему так решил - печальный опыт работы с потоками - чтение одной переменной двумя разными потоками вызывает неадекватное поведение.

PS а где можно почитать об этом, желательно на русском.


Название: Re: Программа валится, если не прицепить отладчик
Отправлено: Old от Апрель 01, 2015, 10:01
Можно. Даже писать можно, но результат будет зависит от умений программиста. :)


Название: Re: Программа валится, если не прицепить отладчик
Отправлено: Igors от Апрель 01, 2015, 10:42
А как же обнуление при переполнении? Растолкуйте, пожалуйста.
Какое обнуление/переполнение? Пример
Код
C++ (Qt)
char * str = new char[1024];
memset(str, 0, 2048);   // ошибка, пишем за пределами блока
 
Это может сразу вылететь, но может и нет. Напр str оказалось в начале страницы выделенной приложению - все норм (тихо гадим).

читать одновременно одну и ту же область памяти из разных потоков нельзя?
Можно, и shared память тоже. 


Название: Re: Программа валится, если не прицепить отладчик
Отправлено: __Heaven__ от Апрель 01, 2015, 14:48
Нет. Игорь, вы дали пример на запись. Моя же функция принимает const char*


Название: Re: Программа валится, если не прицепить отладчик
Отправлено: Igors от Апрель 01, 2015, 15:02
Нет. Игорь, вы дали пример на запись. Моя же функция принимает const char*
В данном случае разницы никакой - при попытке читать адрес не отмапленный в адресное пр-во процесса ОС немедленно выдаст исключение "общая защита"


Название: Re: Программа валится, если не прицепить отладчик
Отправлено: __Heaven__ от Апрель 10, 2015, 09:22
Да, действительно, вы правы.
Я до конца не знал природу сигнала SIGSEGV. Интересно, что без отладчика и на другом пк на линуксе всё работало. Видимо, повезло.
Спасибо.