Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Программирование под Unix/Linux > GDB и стек вызовов


Автор: Perovskit 7.10.2008, 11:16
Где-то в многопоточной программе возникает взаимоблокировка мьютексов. Останавливаю через SIGINT в GDB. Выбираю поток в котором, скорее всего, и есть ошибка, далее:
Код

(gdb) where
#0  0x282a27f3 in _umtx_op () from /lib/libc.so.7
#1  0x28135ead in __error () from /lib/libthr.so.3
#2  0x082054c0 in ?? ()
#3  0x00000005 in ?? ()
#4  0x00000000 in ?? ()
#5  0x00000000 in ?? ()
#6  0x00000000 in ?? ()
#7  0x281379ac in ?? () from /lib/libthr.so.3
#8  0xbfbfe7a8 in ?? ()
#9  0x281318b6 in pthread_mutex_getprioceiling () from /lib/libthr.so.3
Previous frame identical to this frame (corrupt stack?)


Причем это в двух потоках (вероятно, блокирующих друг друга), но здесь непонятно, в какой функции или какой мьютекс работают некорректно. Можно ли в GDB в реальном времени смотреть за вызовами функций определенного потока? Пошаговое выполнение не устраивает, так не знаю, как воспроизвести ошибку -- она где-то раз в полчаса происходит. Очень не хочется перед каждым захватом мьютекса делать cout << "Locking in f()" << endl;

Автор: MAKCim 7.10.2008, 11:33
Цитата(Perovskit @  7.10.2008,  11:16 Найти цитируемый пост)
Очень не хочется перед каждым захватом мьютекса делать cout << "Locking in f()" << endl; 

а зря
нет, серьезно, логгирование в многопоточных программах - лучшее решение
при грамотном логгировании проблема всплывает сама собой

Автор: Perovskit 8.10.2008, 15:57
Спасибо. 

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

Автор: MAKCim 8.10.2008, 16:56
Perovskit
могу посоветовать стараться не использовать глобальные переменные (даже с синхронизацией)

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)