Каковы возможные способы отладки взаимоблокирующих потоков в программе MT, кроме gdb?
Отладка блокирующих потоков в программе MT?
Ответы (4)
На некоторых платформах инструменты обнаружения взаимоблокировок могут помочь обнаружить уже обнаруженные и еще не обнаруженные взаимоблокировки, а также другие ошибки.
В Solaris попробуйте LockLint.
В Linux попробуйте Helgrind или DRD.
Если вы используете POSIX, попробуйте проверить PTHREAD_MUTEX_ERRORCHECK.
Я всегда тратил некоторое время на то, чтобы написать или внедрить гибкое средство ведения журнала в проекты, над которыми я работал, и это всегда хорошо окупалось, превращая сложные ошибки в простые. По крайней мере, обертывание блокирующих примитивов в функции или методы, которые регистрируются до и после регистрации и отображают заблокированный объект и поток, выполняющий блокировку, всегда помогало мне обнулить нарушающий поток за считанные минуты — при условии, что проблема может быть воспроизведена вообще, конечно.
Загрузка программы под отладчиком на самом деле является довольно ограниченным методом определения того, что произошло после взаимоблокировки процесса, поскольку все, что он может дать, — это моментальный снимок того, насколько сильно вы напортачили, а не пошаговое объяснение того, как вы напортачили. который я нахожу намного более полезным.
Или получите Intel Thread Checker. Прекрасная работа.