Могу ли я получить строку кода, которая вызвала исключение? - PullRequest
4 голосов
/ 02 мая 2009

Кроме чтения файла GetFileName() и чтения в строку GetFileLineNumber() кадра стека из

new StackTrace(exception).GetFrame(x)

есть ли способ получить фактическую строку кода (в виде строки), которая вызвала исключение?

Спасибо

Ответы [ 6 ]

2 голосов
/ 02 мая 2009

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

1 голос
/ 02 мая 2009

Он будет скомпилирован, поэтому во время выполнения у вас будет только IL. В лучшем случае вы можете получить IL и декомпилировать его обратно в C #, как рефлектор.

1 голос
/ 02 мая 2009

Нет надежного способа сделать это, потому что информация о строках не хранится в файлах DLL. Информация, которая отображает блоки IL в строки исходного кода, хранится в файле PDB. Вам нужно было бы получить доступ к PDB, чтобы получить информацию о линии для исключения.

Существует достаточно информации о классе StackFrame, чтобы получить соответствующий класс ISymUnmanagedMethod, если PDB доступна. В основном вам просто нужен токен метода и текущее смещение в методе. Это требует от вас понимания внутренней структуры PDB, и я не уверен, документирована ли она где-либо.

PDB API: http://msdn.microsoft.com/en-us/library/ms233503.aspx

1 голос
/ 02 мая 2009

Нет, насколько я знаю, это ваш единственный вариант. Чтобы получить исходную строку кода, которая вызвала исключение, необходимо иметь доступный исходный код. То, что StackFrame уже позволяет вам получить номер строки (через символы отладки - файл PDB в большинстве случаев), делает его достаточно простым, я бы сказал.

Есть ли какая-то конкретная проблема с предложенным вами методом?

0 голосов
/ 05 января 2016

Вы можете получить строку, используя блок try catch:

catch(Exception exception) {
    //exception.StackTrace at the first line has the line you are looking for
}
0 голосов
/ 02 мая 2009

Опубликовать дальнейшую отладку сложно, но не невозможно. Существуют инструменты, которые вы можете использовать (например, здесь и здесь ), а также методы .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...