Как отладить один поток в Visual Studio?
у меня есть решение с некоторым проектам. Есть несколько точек в разных проектах. Я хочу проследить, чтобы первый поток попал в одну из этих точек останова и продолжал отслеживать этот единственный поток, несмотря на то, что другие потоки входят в те же кодовые блоки.
Я знаю, что это возможно путем определения условия на точке останова, то есть имя потока = ... или thread Id = ... но мой случай-это тяжелый груз ASP.NET применение и как только я прикрепляю к w3wp.exe многие потоки попадут в точки останова. Мне нужно что-то вроде ThreadLocal<break-point>.
это возможно? Если да, то как?
8 ответов:
замораживание / оттаивание потоков является неправильным способом, потому что другие потоки не выполняют никакого кода.
наиболее правильным и удобным способом является:
- нажмите Ctrl+A в окне точки останова (выберите все точки останова).
- щелкните правой кнопкой мыши и выберите фильтр"...".
- введите " ThreadId=(текущий идентификатор потока)".
на Visual Studio 2015 и новее, процесс похож:
- нажмите Ctrl+A в меню окно точки останова (выберите все точки останова).
- щелкните правой кнопкой мыши и выберите "Настройки...".
- проверьте "условия" и выберите "фильтр" в выпадающем списке
- введите " ThreadId=(текущий идентификатор потока)".
таким образом, все потоки выполняются, но отладчик попадает только в текущий поток.
вот что я сделал:
установите условную точку останова, которую я знал бы только ударить по нитке то, что я искал.
Как только точка останова попадает, и вы находитесь в нужном потоке, в окне потоков Visual Studio (во время отладки, Debug -> Windows -> Threads), Ctrl + A (чтобы выбрать все темы), а затем Ctrl + щелкните нить, в которой вы находитесь в данный момент. Вы должны были все потоки, кроме того, который вы хотите отладить выбран.
- щелкните правой кнопкой мыши и выберите "заморозить".
теперь Visual Studio будет только проходить через размороженный поток. Кажется, что это намного медленнее, по-видимому, потому, что он должен перебирать все замороженные потоки, но это принесло некоторое здравомыслие в мою многопоточную отладку.
Я только что выпустил расширение Visual Studio 2010+, которое делает именно то, что вы ищете. И это бесплатно :).
презентация
Это расширение Visual Studio добавляет два ярлыка и кнопки панели инструментов, чтобы разработчики могли легко сосредоточиться на отдельных потоках при отладке многопоточных приложений.
Это значительно уменьшает необходимость вручную перейти в окно потоков, чтобы заморозить / разморозить все потоки, но тот, который необходимо соблюдать, и поэтому помогает повысить производительность.
особенности
ограничить дальнейшее выполнение только текущего потока. Заморозит все остальные потоки. Сочетание клавиш: CTRL+T+T или кнопка Снежинка. Переключитесь на следующий одиночный поток (на основе ID). Изменит текущий поток и заморозит все остальные потоки. Сочетание клавиш: CTRL+T+J или кнопка Далее.
зацените здесь, на галерее, на официальная страница или репозиторий Github.
A немного другой подход, который я использовал:
- создать нормальную точку останова и нажмите
- посмотрите в окне потоки для управляемого потока ID, что вы текущая отладка
- щелкните правой кнопкой мыши точку останова в окне точки останова и выберите фильтр
- введите ThreadId=xxx, где xxx-идентификатор потока из 2
- теперь вы можете отлаживать без остановки других потоков и без их попадания в ваш точка останова
Это предполагает, что у вас есть время, чтобы сделать выше, прежде чем второй поток попадает в точку останова. Если нет, и другие потоки попали в точку останова, прежде чем вы сделаете это, вы можете щелкнуть их правой кнопкой мыши в окне "потоки" и выбрать "заморозить".
Если несколько потоков создаются как для веб-приложения, @MattFaus ответ не будет работать. вместо этого я сделал следующее
- установите точку останова, чтобы прервать поток в функции, которую я хочу.
- как только поток достигает точки останова и останавливается, я удаляю точку останова и продолжаю отладку с помощью F8,F10 и F11, чтобы другие потоки могли работать.
Я бы предложил добавить еще один экземпляр приложения на сервере, либо на том же оборудовании или новой машины (кластеров) и затем отлаживать только этот экземпляр. Я бы не стал добавлять точку останова в код, который запускают пользователи. Если это не вариант, я бы добавил больше трассировки.
однако, если это абсолютно необходимо, и вам нужен стат решения, я уверен, что вы можете добавить точку останова, которая ломается только в том случае, если запрос поступает с вашего IP-адреса. Вы бы сделали это с помощью добавление условной точки останова, которая проверяет
HttpContext.Request.UserHostAddress. Обратите внимание, однако, что это значительно замедляет ваше приложение.
Если вы не хотите останавливать все другие потоки (возможно, вы подключаете отладчик Visual Studio к запущенному приложению, которое должно отвечать на запросы), вы можете использовать макрос, который автоматически создает и удаляет точки останова.
Это предлагается в ответ на вопрос переполнения стека "шаг вперед" при отладке многопоточных программ в Visual Studio.
однако ссылка только объясняет, как отлаживать строку за строкой. Я предлагаю вам измените макрос (если вам это удобно), чтобы он изменил все точки останова (например, в заданном диапазоне строк), чтобы остановить только текущий поток.
Я думаю, что это немного отличается в Visual Studio 2015. Они изменили несколько вещей в точках останова, но вот как применить принятый ответ от hzdbyte (выше):
на точке останова в поле кодирования щелкните правой кнопкой мыши > условия > изменить с "условное выражение" на "фильтр". Затем это позволяет фильтровать по ThreadId.
в качестве альтернативы на точке останова в окне точки останова щелкните правой кнопкой мыши > настройки > установите флажок условия и выполните выше.
Comments