У меня есть обычный код С#. У меня нет исключений. Я хочу программно зарегистрировать текущую трассировку стека для цели отладки. Пример:
public void executeMethod()
{
logStackTrace();
method();
}
У меня есть обычный код С#. У меня нет исключений. Я хочу программно зарегистрировать текущую трассировку стека для цели отладки. Пример:
public void executeMethod()
{
logStackTrace();
method();
}
Посмотрите на пространство имен System.Diagnostics
. Здесь много лакомств!
System.Diagnostics.StackTrace t = new System.Diagnostics.StackTrace();
Это действительно здорово, когда ты соскучишь, чтобы узнать, что происходит под капотом.
Я бы порекомендовал вам взглянуть на решения для ведения журнала (такие как NLog, log4net или шаблоны Microsoft и практика Enterprise Library), которые могут достичь ваших целей, а затем и некоторых. Удачи!!
Альтернативой System.Diagnostics.StackTrace
является использование System.Environment.StackTrace, который возвращает строковое представление stacktrace.
Другим полезным вариантом является использование переменных $CALLER
и $CALLSTACK
отладки в Visual Studio, поскольку это может быть включено во время выполнения без восстановления приложения.
Есть два способа сделать это. System.Diagnostics.StackTrace()
даст вам трассировку стека для текущего потока. Если у вас есть ссылка на экземпляр Thread
, вы можете получить трассировку стека для этого через перегруженную версию StackTrace()
.
Вы также можете просмотреть вопрос о переполнении стека Как получить не текущий поток stacktrace?.
Вы также можете сделать это в отладчике Visual Studio без изменения кода.
Конечно, это не поможет, если вы используете код на другом компьютере, но это может быть очень удобно, чтобы иметь возможность автоматически выплевывать трассировку стека, не затрагивая код выпуска или даже не требуя перезапуска программа.
Console.WriteLine(
new System.Diagnostics.StackTrace().ToString()
);
Вывод будет похож на:
в YourNamespace.Program.executeMethod (Строка сообщения)
at YourNamespace.Program.Main(String [] args)
Замените Console.WriteLine
на ваш метод Log
. На самом деле, нет необходимости в .ToString()
для случая Console.WriteLine, так как он принимает object
. Но вам может понадобиться это для вашего метода Log (string msg).
private void ExceptionTest()
{
try
{
int j = 0;
int i = 5;
i = 1 / j;
}
catch (Exception ex)
{
Console.WriteLine("Error: " + ex.Message);
var stList = ex.StackTrace.ToString().Split('\\');
Console.WriteLine("Exception occurred at " + stList[stList.Count() - 1]);
}
}
Кажется, работает на меня