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

StackOverflow https://stackoverflow.com/questions/815395

  •  03-07-2019
  •  | 
  •  

Вопрос

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

new StackTrace(exception).GetFrame(x)

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

Спасибо

Это было полезно?

Решение

Отладка Post moretem сложна, но не невозможна.Есть инструменты, которые вы можете использовать (здесь и здесь например), а также методы.

Другие советы

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

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

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

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

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

PDB API - интерфейс: http://msdn.microsoft.com/en-us/library/ms233503.aspx

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

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

catch(Exception exception) {
    //exception.StackTrace at the first line has the line you are looking for
}
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top