Как отладить один поток в Visual Studio?

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

Я знаю, что это возможно путем определения условия на точке останова, то есть имени потока = ... или ID потока = ... но мой чемодан тяжело загружен ASP.NET применение и как только я прикрепляюсь к w3wp.exe многие потоки попадут в точки останова. Мне нужно что-то вроде ThreadLocal<break-point>.

это возможно? Если да, то как?

8 ответов


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

самый правильный и полезный способ:

  1. нажмите Ctrl+A в окне точки останова (выберите все точки останова).
  2. щелкните правой кнопкой мыши и выберите фильтр"...".
  3. введите " ThreadId=(текущий идентификатор потока)".

на Visual Studio 2015 и новее, процесс похож:

  1. нажмите Ctrl+A в окно точки останова (выберите все точки останова).
  2. щелкните правой кнопкой мыши и выберите "Настройки...".
  3. проверьте "условия" и выберите "фильтр" в раскрывающемся списке
  4. введите " ThreadId=(текущий идентификатор потока)".

таким образом, все потоки выполняются, но отладчик попадает только в текущий поток.


вот что я сделал:

  1. установите условную точку останова, которую I знал бы только, что попал бы на нить то, что я искал.

  2. Как только точка останова попадает, и вы находитесь в нужном потоке, в окне потоков Visual Studio (во время отладки, отладки - > Windows - > Threads),Ctrl + A (для выбора всех потоков), а затем Ctrl + щелкните поток, в котором вы находитесь. Ты должен был все потоки, кроме того, который вы хотите отладить, выбраны.

  3. щелкните правой кнопкой мыши и выберите "заморозить".

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


Я только что выпустил расширение Visual Studio 2010+, которое делает именно то, что вы ищете. И это бесплатно :).

презентация

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

Он значительно уменьшает потребность вручную пойти в окно потоков для того чтобы замерзнуть / оттаять все потоки но тот, которому нужно следовать, и, следовательно, помогает повысить производительность.

особенности

ограничить дальнейшее выполнение только текущего потока. Заморозит все остальные потоки. Ярлык: CTRL+T+T или кнопка Снежинка. Переключитесь на следующий одиночный поток (на основе ID). Изменит текущий поток и заморозит все остальные потоки. Сочетание клавиш: CTRL+T+J или кнопка Далее.

зацените здесь, на галерее, на официальная страница или репозиторий Github.


A немного другой подход, который я использовал:

  1. создать нормальную точку останова и нажмите
  2. найдите в окне "потоки" идентификатор управляемого потока, который вы используете для текущей отладки
  3. щелкните правой кнопкой мыши точку останова в окне точки останова и выберите фильтр
  4. введите ThreadId=xxx, где xxx-идентификатор потока из 2
  5. теперь вы можете отлаживать без остановки других потоков и без их попадания в ваш точка останова

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


Если несколько потоков создаются как для веб-приложения, ответ @MattFaus не будет работать. вместо этого я сделал следующее

  • настройте точку останова, чтобы прервать поток в функции, которую я хочу.
  • как только поток попадает в точку останова и приостанавливается, я удаляю точку останова и продолжаю отладку с помощью F8,F10 и F11, чтобы другие потоки могли работать.

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

однако, если это абсолютно необходимо, и вам нужен стат решения, я уверен, что вы можете добавить точку останова, которая ломается, только если запрос поступает с вашего IP-адреса. Ты бы сделал это, добавление условной точки останова, которая проверяет HttpContext.Request.UserHostAddress. Обратите внимание, однако, что это значительно замедляет ваше приложение.


Если вы не хотите останавливать все другие потоки (возможно, вы подключаете отладчик Visual Studio к запущенному приложению, которое должно отвечать на запросы), вы можете использовать макрос, который автоматически создает и удаляет точки останова.

Это предлагается в ответ на вопрос переполнения стека "Step over" при отладке многопоточных программ в Visual Studio.

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


Я думаю, что это немного отличается в Visual Studio 2015. Они изменили несколько вещей в точках останова, но вот как применить принятый ответ от hzdbyte (выше):

на точке останова в поле кодирования щелкните правой кнопкой мыши > условия > изменить с "условное выражение" на "фильтр". Затем это позволяет фильтровать по ThreadId.

в качестве альтернативы в точке останова в окне точки останова щелкните правой кнопкой мыши > настройки > установите флажок условия и выполните выше.