Где-то в многопоточной программе возникает взаимоблокировка мьютексов. Останавливаю через 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; |