Как обнаружить и устранить проблемы с многопоточностью? - PullRequest
62 голосов
/ 01 февраля 2009

Это продолжение до этого вопроса , где я не получил никакой информации по этому вопросу. Вот краткий вопрос:

Возможно ли обнаружение и устранение проблем, связанных с многопоточным кодом?

Часто нам приходится говорить нашим клиентам: «Мы не можем воспроизвести проблему здесь, поэтому мы не можем ее исправить. Пожалуйста, сообщите нам шаги, чтобы воспроизвести проблему, тогда мы исправим ее». Это довольно неприятный ответ, если я знаю, что это проблема многопоточности, но в основном я не знаю. Как мне узнать, что проблема - это многопоточность, и как ее отладить?

Я хотел бы знать, существуют ли какие-либо специальные каркасы ведения журналов, или методы отладки, или инспекторы кода, или что-нибудь еще, чтобы помочь решить такие проблемы. Общие подходы приветствуются. Если какой-либо ответ должен быть связан с языком, сохраните его для .NET и Java.

Ответы [ 16 ]

1 голос
/ 01 февраля 2009

В блоге Тесс Феррандез есть хорошие примеры использования WinDbg для устранения тупиков в .NET.

1 голос
/ 01 февраля 2009

Visual Studio позволяет вам проверять стек вызовов каждого потока, и вы можете переключаться между ними. Этого отнюдь не достаточно для отслеживания всех видов проблем с потоками, но это только начало. В предстоящем VS2010 запланировано множество улучшений для многопоточной отладки.

Я использовал WinDbg + SoS для решения проблем с потоками в коде .NET. Вы можете проверять блокировки (синхронизировать блоки), стеки вызовов потоков и т. Д.

0 голосов
/ 30 мая 2017

Я использую GNU и использую простой скрипт

$ больше gdb_tracer

b func.cpp:2871
r
#c
while (1)
next
#step
end
0 голосов
/ 30 января 2013

Я столкнулся с проблемой потока, которая давала ОДИН ЖЕ неправильный результат и не вел себя непредсказуемо, поскольку каждый раз другие условия (память, планировщик, загрузка обработки) были более или менее одинаковыми.

Исходя из своего опыта, я могу сказать, что HARDEST PART должен признать, что это проблема с потоками, а BEST SOLUTION - внимательно изучить многопоточный код. Просто внимательно посмотрев на код потока, вы должны попытаться выяснить, что может пойти не так. Другие способы (дамп потока, профилировщик и т. Д.) Будут на втором месте.

0 голосов
/ 01 февраля 2009

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

0 голосов
/ 01 февраля 2009

Разработайте код так, как принцесса рекомендовала для вашего другого вопроса (Неизменяемые объекты и передача сообщений в стиле Erlang) Обнаружить проблемы с многопоточностью будет легче, поскольку взаимодействия между потоками будут четко определены.

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