Отладка многопоточных приложений
У меня есть приложение, написанное на C++ и MFC, которое является многопоточным, работает на Windows. Иногда я получаю некоторые жалобы, такие как взаимоблокировки или необработанное исключение, которое вызывается из-за этих потоков. Обычно я использую Visual Studio (если проблема воспроизводима) или использую WinDbg для анализа сгенерированных файлов дампа. Есть ли лучший способ сделать это? Могу ли я использовать некоторые другие инструменты для этого?
4 ответа
Я бы порекомендовал Intel Thread Checker, если у вас достаточно на это бюджета. Он отлично анализирует программы бега и предупреждает вас о возможных условиях гонки.
Проверьте демонстрационное видео для получения дополнительной информации.
Если вы блокируете блокировку CRITICAL_SECTION, вы можете использовать расширение отладчика! Locks в WinDbg, чтобы узнать, какому потоку принадлежит удерживаемая блокировка, а затем использовать команду kb для просмотра стека вызовов этого потока.
Я еще не использовал его, но Relacy Race Detector звучит довольно полезно для отслеживания некоторых классов проблем с многопоточностью.
Многопоточные системы сложны и локализация засоров производится не только с помощью соответствующих инструментов. Чтобы найти причину тупика, вы можете поместить запись блокировки / разблокировки в таблицу таблиц. При запуске "блокировки действий" вы сохраняете в таблице, при разблокировке удалите запись из таблицы. В конце цикла вы можете записать состояние таблицы или ожидать, что определенное событие сделает это.
Постройте эту реализацию в dll, чтобы вы могли использовать ее и в других проектах.