2017-02-14 10 views
1

Я отлаживаю программу C# в Visual Studio 2015.Могу ли я узнать последнее утверждение, выполненное во время отладки в Visual Studio 2015?

Выполнение переходит к выписке из кода где-то внутри кода в инструкции try.

Как узнать последний выполненный оператор, то есть тот, который вызывает исключение?

Спасибо.

+8

_stack trace_ за исключением показывает вам, где он был брошен. –

+1

Используйте отладчик, переходите (F5) и в (F11) каждый метод, пока не найдете, где он выдает ошибку. – Mark

ответ

1

Вы можете установить точку останова в каждом утверждении в предложении try или просто использовать функцию, предлагаемую Visual Studio. Где-то внизу (где обычно находится консоль) может быть окно под названием «Call Stack». Это показывает порядок выполнения последних операторов.

+1

Когда вы находитесь в блоке 'catch', окно трассировки стека больше не показывает стек, как это было в заявлении, в котором было исключение. –

6

Посмотрите на ваш трассировки стека:

static void Main(string[] args) 
{ 
    try 
    { 
     Console.WriteLine("starting"); 
     throw new Exception("Testing"); 
     Console.WriteLine("unreachable"); 
     Console.ReadKey(); 
    } 
    catch (Exception ex) 
    { 
     Console.WriteLine(ex.ToString()); 
     throw; 
    } 
} 

Выход:

начиная

System.Exception: Тестирование на ConsoleApplication1.Program.Main (String [] арг) в C: \ Users \ dfield \ Documents \ Visual Studio 2015 \ Projects \ ConsoleApplication1 \ ConsoleApplication1 \ Program.cs: строка

Line 161 throw new Exception("Testing");

Есть, вероятно, несколько исключений (ха) этот метод - например, когда StackOverflowException или OutOfMemoryException происходит (я думаю), или если пользовательское исключение удаляет или иным образом изменяет StackTrace объект на Exception (Я видел, как это сделано для обфускации трассировки стека, которая возвращается клиенту, который не должен ее видеть). Вам также может потребоваться просмотреть трассировку стека InnerException.

+0

Спасибо. У меня нет окна, показывающего трассировку стека. Как открыть такое окно? – Tim

+0

Если вы установили точку останова при вводе блока 'catch', вы можете проверить переменную' ex' и посмотреть на ее трассировку стека. –

+0

Или он появится на вкладке __Locals__, и вы можете проверить его там или использовать что-то вроде 'System.Diagnostics.Debug.WriteLine (ex.ToString())', чтобы получить это в окне __Output__ –

1

Когда вы ловите исключение, посмотрите на значение StackTrace, это даст вам всю необходимую информацию о том, где исключение происходит с причиной, за исключением:

Пример: Пытался преобразовать строку в целое, используя Int32.Parse ("Hello"); сгенерирует исключение и трассировки стека, как показано ниже:

в System.Number.StringToNumber (String ул, опции NumberStyles, NumberBuffer & номер, NumberFormatInfo информация, Boolean parseDecimal) в System.Number.ParseInt32 (String s, NumberStyles стиль , NumberFormatInfo информация) на System.Int32.Parse (String s) в test123() в Program.cs: линии 32

2

Убедитесь, что вы включили Common Language Runtime Exceptions в настройках исключений. Когда этот флажок установлен, отладчик должен прерываться при ошибке, непроверяемый при необработанном.

enter image description here

enter image description here

1

Откройте окно diagnostic tools и поиск красного элемента в Events списке.

Дважды щелкните по нему, чтобы перейти непосредственно к линии, которая вызывает исключение.

enter image description here