Могу ли я всегда отлаживать несколько экземпляров одного и того же объекта типа thread с GDB? - PullRequest
2 голосов
/ 19 мая 2010

программа работает нормально.Когда я ставлю точку останова, возникает ошибка сегментации.Это я или GDB?Во время выполнения этого никогда не происходит, и если я создаю экземпляр только одного объекта, то никаких проблем.

Я использую QtCreator на ubuntu x86_64 karmic koala.

UPDATE1:

Я сделалнебольшая программа, содержащая упрощенную версию этого класса.Вы можете скачать его по адресу:

пример программы

, просто поставьте точку останова в первой строке функции drawChart () и войдите в нее, чтобы увидеть, как произошла ошибка segfault

ОБНОВЛЕНИЕ 2: Это еще одна небольшая программа, но она практически такая же, как в примере с Mandlebrot, и она все еще происходит.Вы можете различить его с помощью мандлеброт, чтобы увидеть небольшую разницу.

почти так же, как в примере программы Mandlebrot

Ответы [ 2 ]

2 голосов
/ 19 мая 2010

Чтобы ответить на ваш вопрос: Да, вы должны иметь возможность отлаживать несколько потоков с помощью GDB. Это зависит от того, какой дизайн будет звучать.

Существует вероятность того, что у вас есть состояние гонки для данных, к которым имеют доступ ваши потоки. Возможно, что проблема не отображается при нормальном запуске программы, но подключение отладчика меняет время и расписание. Тем не менее, вы должны иметь возможность использовать отладчик, чтобы прервать работу, когда произойдет ошибка. Понимание того, где это происходит, может проинформировать вас о состоянии гонки или коррупции в любом случае.

На это стоит обратить внимание, потому что даже если это не происходит в большинстве условий работы, оно может проявляться при различных условиях загрузки системы.

0 голосов
/ 27 мая 2010

Вы вызываете код рисования Qt из нескольких потоков? (особенно методы виджетов)

http://doc.qt.nokia.com/4.3/threads.html#reentrancy-and-thread-safety

Похоже, что Qt похож на GTK +, и вы должны касаться графического интерфейса только из одного потока (в частности, основного)

Я недостаточно знаком с Qt, чтобы дать вам совет о том, как изменить ваш код, но я бы предложил изменить его на основанный на событии (т. Е. Рендеринг начинается в ответ на событие, а затем вызывает событие в главном окне). Когда поток завершен, каждый поток имеет свою собственную основную петлю), так что вы, вероятно, сможете полностью избежать мьютексов и синхронизации.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...