[c#] Как отлаживать один поток в Visual Studio?


3 Answers

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

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

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

  3. Щелкните правой кнопкой мыши и выберите «Заморозить».

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

Question

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

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

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




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

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




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

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

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




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

В точке останова в поле кодирования щелкните правой кнопкой мыши> Условия> Изменить с «Условное выражение» на «Фильтровать». Затем вы можете фильтровать ThreadId.

В качестве альтернативы в точке останова в окне «Точки останова» щелкните правой кнопкой мыши> «Настройки»> отметьте поле «Условия» и выполните описанное выше.




Related