C # /. NET инструмент анализа, чтобы найти условия гонки / взаимоблокировки - PullRequest
39 голосов
/ 04 марта 2010

Есть ли инструмент, который анализирует код .NET и находит условия гонки?

У меня есть немного кода, который имеет открытое статическое свойство, которое получает или создает личное статическое поле. Он также имеет открытый статический метод, который устанавливает это поле в ноль (... да, я знаю! ..)

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

Я ищу инструмент или, возможно, сценарий SQL nDepend (если это возможно).

Ответы [ 6 ]

20 голосов
/ 04 марта 2010

Вы, наверное, ищете одно из них:


ПРИМЕЧАНИЕ : Этот ответ с 2010 года. Как и во всех ответах на рекомендации, рекомендации, как правило, со временем меняются. Там могут быть и другие продукты, CHESS, который был проектом Microsoft Research Labs, возможно, превратился в конечный продукт или был полностью списан. Пожалуйста, ответьте на этот вопрос солью и проведите новое исследование, какие продукты подходят сейчас.

4 голосов
/ 04 марта 2010

Jinx сделает это во время выполнения (не статично), но, возможно, стоит посмотреть.

3 голосов
/ 27 апреля 2015

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

Моя цель - обнаружить тупики до того, как они произойдут, например, если у вас есть два ресурса, вы знаете, что всегда должны использовать их в одном и том же порядке, иначе может возникнуть тупик .

lock (lockObj1) 
lock (lockObj2) 
{ 
    // some code
} 

... где-то еще в приложении ...

lock (lockObj2) 
lock (lockObj1) // <- I expect some "possible deadlock" detection here 
{ 
    // some code
} 

В этом случае я использую lockObj1, а затем lockObj2 в одном месте и использую их в обратном порядке в другом месте, этого вам следует избегать в приложении Конечно, операторы блокировки не нужно использовать один за другим, как в примере, ваше сложное приложение может иметь несколько сложных объектов, взаимодействующих друг с другом

Я загрузил код с тестовыми примерами здесь https://github.com/glmnet/LockTracer

3 голосов
/ 04 марта 2010

Вы можете проверить ШАХМАТЫ .

2 голосов
/ 15 июля 2011

См. Ответы здесь: Какие инструменты статического анализа доступны для C #?

Некоторые инструменты статического анализа могут обнаруживать тупики.

Также попробуйте FxCop от Microsoft.

0 голосов
/ 04 марта 2010

Вы смотрели на Муравьев Красных Ворот ? Я не уверен, что он сделает все, что вам нужно, но это хороший продукт для:

  • Определение узких мест производительности за считанные минуты
  • Оптимизация производительности приложений .NET
  • Развернуть до медленных строк кода с временными интервалами на уровне строк
  • Профиль aspx, ASP.NET, код C # и приложения VB.NET
...