Обнаружение мертвых блокировок в приложении C# [дубликат]

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

22
задан Community 23 May 2017 в 11:55
поделиться

7 ответов

Вместо того, чтобы использовать постоянного клиента lock & Monitor.Enter подход для блокировки некоторых данных можно также использовать структуру 'TimedLock'. Этот TimedLock выдает исключение, если блокировка не могла бы быть получена своевременно, и он может также дать Вам предупреждение, если у Вас есть некоторые блокировки, которые Вы не выпускали.

Этот статья Ian Griffiths могла, возможно, помочь.

8
ответ дан Frederik Gheysels 29 November 2019 в 04:51
поделиться

Можно использовать WinDbg для осмотра потоков в приложении. Вот краткий план того, что Вы могли сделать.

  • , Когда приложение зависнет, скопируйте файлы WinDbg в машину.
  • Или присоединение WinDbg к процессу или использование ADPlus для получения подвешивать дампа процесса. При выборе ADPlus Вы затем загружаете дамп в WinDbg.
  • От WinDbg Вы загружаете sos.dll, таким образом, можно осмотреть управляемый код.
  • Эти !threads команда покажет Вам всем потоки в приложении и эти !clrstack команда, покажет Вам, что они делают. Используйте ~e!clrstack для дампа стека вызовов всех потоков. Ищите вызовы для Ожидания методов, поскольку они указывают на блокировку.
  • Эти !syncblk команда даст Вам информацию того, какие потоки содержат различные блокировки.
  • Для обнаружения то, что блокирует данный поток, пытается получить, переключиться на поток и осмотреть объекты стека (!dso). Отсюда необходимо смочь найти блокировку, которую поток пытается получить.

Разъяснение: WinDbg не требует регулярной установки. Просто скопируйте файлы. Кроме того, при взятии подвешивать дампа можно продолжить отлаживать на другой машине, раз так желаемой.

Дополнение: Sosex имеет эти !dlk команда, которая автоматически определяет мертвые блокировки во многих ситуациях. Это не работает все время, но когда это делает, это делает всю работу для Вас, так, чтобы был Ваш предпочтительный вариант.

23
ответ дан Brian Rasmussen 29 November 2019 в 04:51
поделиться

Конец в http://blogs.technet.com/askperf/archive/2007/06/15/capturing-application-crash-dumps.aspx говорится, что на Vista, по крайней мере, можно получить дамп катастрофического отказа рабочего процесса с помощью Диспетчера задач.

1
ответ дан ChrisW 29 November 2019 в 04:51
поделиться

У Вас на самом деле есть очень интересная проблема там. Существует несколько вещей, которые можно сделать:

Использование хороший регистратор: Один из способа воспроизвести много ошибку потока состоит в том, чтобы иметь регистратор, который распечатает принятые меры и поток, который выполнил их, тот способ, которым можно найти трассировку руководствами Вы к ошибке. Это - довольно легкое решение, если можно добавить регистратор.

Использование FSP: Определите свою многопоточную систему с помощью FSP. Таким образом, Вы сможете создать конечный автомат процесса, который можно обойти до находки ошибку. Этим решением является более математическое решение.

два решения/процедуры я даю Вам, точно основные отличия приближения к многопоточной разработке между некоторым британским universitis и Amercian. В Великобритании преподаватели более добры, чтобы попытаться проверить их систему, не имеет никаких ошибок с помощью FSP, прежде чем они будут программировать его, и американцы предпочитают тестировать для проверки, они работают правильно, вопрос вкуса.

я действительно рекомендую прочитать эту книгу: Jeff Magee и Jeff Kramer: Параллелизм: Модели Состояния и Программы Java, Wiley, 1999

1
ответ дан mandel 29 November 2019 в 04:51
поделиться

Это - очень интересная проблема и боль, потому что это только происходит каждые несколько дней. Я нашел эта статья о CodeProject. Это мог бы быть запуск для Вас.

старый школьный подход должен зарегистрировать тонну сообщений и использовать файлы журнала, чтобы попытаться обнаружить, когда он происходит. :)

0
ответ дан Szymon Rozga 29 November 2019 в 04:51
поделиться

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

0
ответ дан Tim Jarvis 29 November 2019 в 04:51
поделиться

Тайм-ауты в параллельном программировании - ужасная идея. Это приводит к недетерминизму и, следовательно, к поведению, которое невозможно воспроизвести. Попробуйте использовать инструмент обнаружения тупиковых ситуаций, например CHESS. Еще лучше минимизировать количество используемых блокировок с помощью алгоритмов без блокировок, или полностью отказаться от блокировок и разбить программу на однопоточные отсеки и использовать очереди для передачи данных между отсеками (более известный как передача сообщений/акторный параллелизм).

6
ответ дан 29 November 2019 в 04:51
поделиться
Другие вопросы по тегам:

Похожие вопросы: