Инструмент анализа C# / .NET для поиска условий гонки/тупиков
есть ли инструмент, который анализирует .NET-код и находит условия гонки?
У меня есть немного кода, который имеет публичное статическое свойство, которое получает или создает частную статического поля. Он также имеет открытый статический метод, который устанавливает для этого поля значение null (...да, я знаю!..)
поскольку ни один из этих методов не блокируется, можно с уверенностью сказать, что в будущем все пойдет ужасно неправильно. Мне нужен инструмент, который будет рекурсивно проходить через вещи, которые вызывают любой из них методы и посмотреть, если что-то было порождено в другом потоке.
Я ищу инструмент или, возможно, SQL-скрипт nDepend (если это возможно).
6 ответов
вы, вероятно, ищете один из них:
Примечание: этот ответ с 2010 года. Как и во всех ответах на рекомендации, рекомендации со временем меняются. Там могут быть и другие продукты, шахматы, которые были исследовательскими лабораториями Microsoft, возможно, превратились в конечный продукт или были полностью уничтожены. Пожалуйста, примите этот ответ с крупинкой соли и провести новые исследования, в которых продукты подходят сейчас.
Джинкс будет делать это во время выполнения (не статически), но, возможно, стоит посмотреть.
см. ответы здесь:какие инструменты статического анализа доступны для C#?
некоторые инструменты статического анализа могут выполнять обнаружение взаимоблокировки.
кроме того, попробовать FxCop из Microsoft.
я экспериментировал над тем, как легко отслеживать их. Я работал над отслеживанием некоторых тупиков, особенно в сценариях, где используется много разных операторов блокировки.
моя цель-обнаружить тупики до их возникновения, например, если у вас есть два ресурса, вы знаете, что всегда должны использовать их в том же порядке, иначе тупик может произойти.
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
вы смотрели Муравьи Красных Ворот? Я не уверен, что он сделает все, что вам нужно, но это хороший продукт для:
- определить узкие места производительности в течение нескольких минут
- оптимизация производительности приложений .NET
- детализация до медленных строк кода с таймингами уровня строки
- профиль aspx, ASP.NET, код C# и VB.NET приложения