Страницы

Поиск по вопросам

понедельник, 25 ноября 2019 г.

Как узнать, откуда был вызван метод?


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


Ответы

Ответ 1



Посмотреть откуда был вызван метод можно в окне Debug → Windows → Call Stack В нем же можно просмотреть значения локальных переменных в вызывающих методах. даже поставить брекпойнт на момент возврата в вызывающий метод - например, выбрав Main на скриншоте и нажав F9 (прямо в этом окне, а не в исходнике Main). "Отмотать назад" тоже можно. Но только в Visual Studio Enterprise 2015 при заранее влюченной опции сборки информации о вызовах (Tools/Options/IntelliTrace/events and call information) Debug → Windows → IntelliTrace Calls:

Ответ 2



Дополнение к другим ответам: Если вы не хотите каждый раз останавливать программу, попробуйте просто залогировать строку new System.Diagnostics.StackTrace().ToString(); Например, System.Diagnostics.Debug.WriteLine(new System.Diagnostics.StackTrace().ToString()); распечатает текущий стек в окно отладки Output.

Ответ 3



В дополнение к сказанному, можно создать специальный метод для трассировки, вложит его во все диагностируемые методы. Атрибут CallerMemberName (.NET 4.5) поможет определить вызывающий метод. Пример с MSDN: public void DoProcessing() { TraceMessage("Something happened."); } public void TraceMessage(string message, [System.Runtime.CompilerServices.CallerMemberName] string memberName = "", [System.Runtime.CompilerServices.CallerFilePath] string sourceFilePath = "", [System.Runtime.CompilerServices.CallerLineNumber] int sourceLineNumber = 0) { System.Diagnostics.Trace.WriteLine("message: " + message); System.Diagnostics.Trace.WriteLine("member name: " + memberName); System.Diagnostics.Trace.WriteLine("source file path: " + sourceFilePath); System.Diagnostics.Trace.WriteLine("source line number: " + sourceLineNumber); } // Sample Output: // message: Something happened. // member name: DoProcessing // source file path: c:\Users\username\Documents\Visual Studio 2012\Projects\CallerInfoCS\CallerInfoCS\Form1.cs // source line number: 31 p.s. так же можно просто добавить нужные атрибуты в параметры диагностируемого метода и передавать их в метод трассирови, либо сразу выводить через System.Diagnostics.Debug или System.Diagnostics.Trace.

Комментариев нет:

Отправить комментарий