У меня есть решение с некоторыми проектами. Есть несколько точек останова в разных проектах. Я хочу отследить, как первый поток достиг одной из этих точек останова, и продолжить отследить этот единственный поток, несмотря на то, что другие потоки входят в одни и те же кодовые блоки.
Я знаю, что это возможно через определение условия на точке останова, то есть, имя потока = ... или идентификатор потока = ... но в моем случае это приложение ASP.NET с высокой нагрузкой, и как только я присоединяюсь ко w3wp.exe
многим темы будут бить точки останова. Мне нужно что - то типа ThreadLocal<break-point>
.
Является ли это возможным? Если да, то как?
Ответы:
Замораживание / оттаивание потоков - неправильный способ, потому что другие потоки не выполняют никакого кода.
Самый правильный и удобный способ:
В Visual Studio 2015 и новее процесс аналогичен:
Таким образом, все потоки выполняются, но отладчик работает только с текущим потоком.
источник
System.Threading.Thread.CurrentThread.ManagedThreadId
что-то печатаете ?Вот что я сделал:
Установите условную точку останова, которая, как я знал, будет попадать только в поток, который я искал.
Как только достигнута точка останова, и вы попадаете в нужный поток, в окне Потоки Visual Studio (при отладке, Отладка -> Windows -> Потоки), Ctrl+ A(чтобы выбрать все потоки), а затем Ctrl+ щелкните по потоку, в котором вы находитесь в данный момент. , Вы должны выбрать все потоки, кроме той, которую хотите отлаживать.
Теперь Visual Studio будет только проходить через размороженный поток. Кажется, что это происходит намного медленнее, вероятно, потому, что он должен проходить через все замороженные потоки, но это принесло некоторую здравомыслие в мою многопоточную отладку.
источник
Я только что выпустил расширение Visual Studio 2010+, которое делает именно то, что вы ищете. И это бесплатно :).
Проверьте это здесь, в Галерее , на официальной странице или в репозитории Github .
источник
Если несколько потоков создаются как для веб-приложения, ответ @MattFaus не будет работать. вместо этого я сделал следующее
источник
Немного другой подход , который я использовал:
Это предполагает, что у вас есть время сделать выше, прежде чем второй поток достигнет вашей точки останова. Если нет, и другие потоки достигли вашей точки останова, прежде чем вы сделали выше, вы можете щелкнуть по ним правой кнопкой мыши в окне потоков и выбрать остановку.
источник
lock(m_someObject) { ; }
В VS 2019:
источник
Я бы предложил добавить еще один экземпляр приложения на работающий сервер, либо на том же оборудовании, либо на новом компьютере (кластеризовать его), а затем отладить только этот экземпляр. Я бы не добавил точку останова в коде, который запускают пользователи. Если это не вариант, я бы добавил больше трассировки.
Однако, если это абсолютно необходимо и вам нужна статистика решения, я уверен, что вы могли бы добавить точку останова, которая прерывается, только если запрос приходит с вашего IP-адреса. Это можно сделать, добавив условную точку останова, которая проверяет
HttpContext.Request.UserHostAddress
. Обратите внимание, что это значительно замедляет ваше приложение.источник
Если вы не хотите останавливать все остальные потоки (возможно, вы подключаете отладчик Visual Studio к работающему приложению, которое должно отвечать на запросы), вы можете использовать макрос, который автоматически создает и удаляет точки останова.
Это предлагается в ответе на вопрос переполнения стека «Перешагнуть» при отладке многопоточных программ в Visual Studio .
Однако ссылка только объясняет, как отлаживать построчно. Я предлагаю вам изменить макрос (если вам это удобно), чтобы он изменил все точки останова (например, в заданном диапазоне строк), чтобы останавливаться только на текущем потоке.
источник
Я думаю, что это немного отличается в Visual Studio 2015. Они изменили несколько вещей в точках останова, но вот как применить принятый ответ от hzdbyte (выше):
На точке останова в поле кодирования щелкните правой кнопкой мыши> Условия> Изменить с «Условное выражение» на «Фильтр». Это тогда позволяет вам фильтровать по ThreadId.
В качестве альтернативы в точке останова в окне «Точки останова» щелкните правой кнопкой мыши> «Настройки»> установите флажок «Условия» и выполните указанные выше действия.
источник
Установите условие точки останова, щелкнув правой кнопкой мыши на боковой панели линии. Выберите «Условие» и введите следующее с названием вашей темы в кавычках:
System.Threading.Thread.CurrentThread.Name == "name_of_your_thread"
В качестве альтернативы вы можете сделать то же самое, получив «Управляемый ID» потока из окна «Threads» и используя:
System.Threading.Thread.CurrentThread.ManagedThreadId == your_managed_thread_id
источник