Есть громоздкий код, выполняю его отладку. Есть метод, который часто вызывается и
разных мест. Можно ли по точке останова узнать, откуда он был вызван? Или может можно вернуться назад по шагам?
Ответы
Ответ 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.
Комментариев нет:
Отправить комментарий