Есть ли способ прервать выполнение следующей строки кода, выполняемого в Visual Studio?

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

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

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

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


person mezoid    schedule 02.09.2009    source источник
comment
Как проявляется эта ошибка? Разве вы не можете установить там точку останова? Или вы знаете какой-либо другой код, который будет выполнен после того, как вы нажмете эту кнопку, чтобы установить там точку останова? Если да, взгляните на окно стека. Он должен показать вам вызываемый обработчик событий. Затем вы можете поставить там точку останова.   -  person sbi    schedule 02.09.2009
comment
@sbi ошибка проявляется, когда я нажимаю кнопку, которая расширяется, чтобы показать больше информации, и в итоге показывает больше данных, чем требуется. Я пытался найти, какой метод добавить фильтрацию к отображаемым данным. В конце концов я смог обнаружить метод, который имел неудачное название. Это был метод делегата при доступе к элементу таблицы данных. Я все еще хочу, чтобы это было легче найти ...   -  person mezoid    schedule 02.09.2009
comment
@Kyralessa Какой это потрясающе бесполезный комментарий. Возможно, вы могли бы найти лучший способ заставить меня пересмотреть ваш ответ, чем оскорбить меня ...   -  person mezoid    schedule 29.01.2010
comment
Могу заверить вас, что я не просто отвергал каждый ответ ... Я просто принял тот, который был близок к тому, чтобы удовлетворить мои потребности, хотя это не идеальный ответ ... лично мне ваш ответ больше нравится, но это не так и у меня не работает, поэтому я не могу принять это как ответ ...   -  person mezoid    schedule 29.01.2010
comment
Я думаю, проблема заключается в том, чтобы попробовать это на странице ASPX. Я сейчас борюсь с MVC. Вероятно, когда вы впервые нажимаете кнопку, он переходит на язык сценария, который обрабатывает страницу. Поскольку мы не можем поставить там точку останова, мы не можем видеть указатель стека.   -  person Baz Guvenkaya    schedule 12.02.2015


Ответы (5)


Вы пробовали кнопку «Отладка»> «Разбить все» («пауза»)? (Ctrl + Break)

Отладка› Разбить все

Обычно он ломается где-то довольно низко в стеке, например, в Show () для вашей основной формы в приложении WinForms, но если вы затем выполните Шаг с заходом, чтобы обойти это, это часто будет хорошо работать для такого рода вещей.

person Ryan Lundy    schedule 02.09.2009
comment
Я не уверен, что кнопка «Разбить все» - это именно то, что я ищу, поскольку я думаю, что код будет выполнен в течение миллисекунд после моего щелчка по экрану, и поэтому я не смогу приостановить его достаточно быстро. - person mezoid; 02.09.2009
comment
Повторяю: вы пробовали это? Вы не пытаетесь щелкнуть «Разбить все» после того, как нажмете кнопку. Вы нажимаете "Разбить все" перед нажатием кнопки, затем щелкаете "Шаг с заходом" и затем нажимаете кнопку. - person Ryan Lundy; 02.09.2009
comment
Хорошо, я попробовал еще раз ... и это не сработало. Возможно, это потому, что я отлаживаю страницу aspx. Когда я нажимаю на паузу, а затем нажимаю что-то в окне, все, что он делает, это пытается загрузить страницу ... но ничего не происходит ... Мне нужно нажать запустить, а затем снова приостановить его, прежде чем он сломается, и к тому времени уже слишком поздно . Мне нужно будет попробовать ваше предложение, например, приложение WinForms или Console, и посмотреть, как оно с этим справится ... если это сработает, я отмечу ваше как ответ ... но то, что мне нужно, это не так ' похоже, не работает ... - person mezoid; 29.01.2010
comment
Хорошо, я попробовал это с помощью простого приложения WinForms и понял, что делаю не так. Когда я нажимаю на паузу, приложение останавливается и останавливается на одной из строк кода WinForm по умолчанию. Затем я нажал F11, что позволило мне получить доступ к WinForm. Нажатие одной из кнопок в форме привело меня прямо к этой строке кода, а это именно то, что я хотел. Мне нужно будет попробовать его на работе со страницей aspx и посмотреть, работает ли там тоже. Я постараюсь отметить ваш как ответ ... извините, я так долго разбирался ... но я ценю то, что узнал то, что я хотел узнать в течение многих лет - person mezoid; 29.01.2010
comment
Это хороший ответ, и я не думаю, что это что-то очевидное. Простой - Разбить все, F11 (Шаг, обычно в строке Application.Run), нажмите кнопку в форме, код прерывается в этом месте. Это не сработает, если у вас что-то происходит ... например, WndProc переопределяет и т. Д. Вещи, которые запускаются при перекачке сообщений. В других случаях это работает нормально и является простым способом сказать: «Прервать следующее действие, которое я сделаю (например, щелкнув кнопку!)». - person Matthew M.; 27.07.2011
comment
Если у вас есть фоновые рабочие процессы в вашем приложении и вам нужно установить следующую строку, выполняемую в основном потоке, тогда эта процедура также работает. Просто убедитесь, что текущий поток установлен в основной поток, прежде чем переходить к нему. - person Fls'Zen; 20.11.2012
comment
Обновление: я упоминал, что это не работает, если вы делаете такие вещи, как переопределение WndProc, захват событий клавиатуры и т. Д. - решение состоит в том, чтобы добавить атрибут [DebuggerStepThrough] в ваш метод. Это обойдет этот метод и позволит вам перейти к следующему методу после того, как вы завершите все и нажмете F11, но обойдет любой другой метод, который вы не хотите отлаживать. - person Matthew M.; 11.12.2013
comment
Мне также интересно выяснить, как сломать код на следующей выполненной строке. Я попробовал «Разбить все», но тут говорится, что мне нужно отключить «Только мой код». Думаю, я уже делал это раньше, и это был кошмар. Я понятия не имел, что происходило после этого, и потребовалось время, чтобы все вернулось в норму. - person Travis Heeter; 13.11.2015
comment
@MatthewM. Атрибут [DebuggerStepThrough] звучит великолепно! СПАСИБО! - person Jason Stevenson; 25.01.2016

Вы ищете Step Into (F11) или Step Over (F10)?

-- Редактировать

Вы тоже знаете об окне Call Stack? Это может помочь вам определить ваше местоположение и то, что происходит.

person Noon Silk    schedule 02.09.2009
comment
извините, мне известны F11, F10 и окно стека вызовов. Я ищу что-то, что позволяет мне сломаться, когда я попадаю в базу кода после запуска действия на странице aspx. - person mezoid; 02.09.2009
comment
мезоид: возможно, вы хотите написать System.Diagnostics.Debugger.Break(); в определенной части вашего кода? Это заставит отладчик сломаться, независимо от того, явно ли вы устанавливаете точку останова? - person Noon Silk; 02.09.2009
comment
за исключением того, что я не знаю, где находится класс, что мне нужно вставить перерыв ... :( - person mezoid; 02.09.2009
comment
Да ... что ж, боюсь, здесь мало что может вам помочь, кроме применения логики :) (ну, может быть, это: stackoverflow.com/questions/907856/), если Мехрдад принимает это как проект: P) - person Noon Silk; 02.09.2009
comment
хорошо, тогда, если нет ничего, что делает то, что я ищу, мне придется наградить вас ответом только за то, что вы сказали мне, что это невозможно. :) Спасибо за вашу помощь! - person mezoid; 02.09.2009
comment
Вы не должны награждать кого-либо ответом. Вы должны делать это только в том случае, если на ваш вопрос ответят. Мне кажется, вы не приложили много усилий, чтобы попробовать хоть один из приведенных ответов. Полагаю, это ваш выбор. - person Ryan Lundy; 02.09.2009

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

person scottm    schedule 02.09.2009
comment
правда, но я хочу найти способ, чтобы не устанавливать целую кучу точек останова, чтобы найти код, который я ищу - person mezoid; 02.09.2009

Отладка -> Исключения

Выбранная проверка исключений CLR.

ИЗМЕНИТЬ

Скорее всего, у вас исключение CLR. При использовании этого метода отладчик всегда прерывает работу при возникновении исключения. Это очень удобно по сравнению с чтением трассировки стека.

person ChaosPandion    schedule 02.09.2009
comment
это хорошо, но в моем случае ошибка, которую я ищу, не вызвана исключением - person mezoid; 02.09.2009

Некоторые идеи:

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

  • Добавьте дополнительный обработчик событий для события (создайте его заранее - например, в конструкторе - чтобы он добавлялся перед всеми другими обработчиками событий, которые добавляет ваше приложение, и поэтому мы надеемся, что он вызывается первым) и закрепите в нем точку останова. Как только вы достигли точки останова, вы можете пошагово перебирать другие обработчики событий в событии.

  • напишите собственный обработчик событий, который обрабатывает щелчок и просто генерирует новое событие. Присоедините к этому вторичному событию все остальные обработчики событий. Затем вы можете установить точку останова на первом обработчике и пройти через вызываемые им вторичные обработчики.

person Jason Williams    schedule 02.09.2009