Как распечатать номер строки во время запуска приложения в vb.net

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

Вопрос

Я хотел бы распечатать свое сообщение отладки с номером строки в приложении vb.net. Мне это понравилось,

Dim st As StackTrace
Dim sf As StackFramee
st = New StackTrace(New StackFrame(True))
sf = st.GetFrame(0)
Console.WriteLine.("Line " & sf.GetFileLineNumber())

Я хочу поместить фрагмент в класс, каждый раз, когда я вызову метод Logmsg, чтобы ввести мое сообщение с номером строки в исходном коде. Но я обнаружил, что если я помесчу фрагмент выше в класс, номер линии всегда был одинаковой, это линия, которую я новый «St».

Функция точно та же с _ЛИНИЯ Макро в C ++. На самом деле я программист C ++.

В любом случае, чтобы решить эту проблему? Спасибо.

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

Решение

Код, который вы показали, работает точно так же, как и ожидалось. Он печатает номер линии, где вы запечатлели кадр стека. Поскольку вы определили его в другом классе, он печатает номер строки файла, который содержит этот класс.

А GetFrame Метод важен здесь. Рамки стека пронумерованы, начиная с 0, что является последний Кадра стека натолкнулась. Итак, ссылаясь на кадр 0, вы инструктируете во время выполнения печатать номер строки последний Кадра стека, которая была натолкнута. Когда один метод вызывает другой, создается новый кадр стека.

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

Public Sub PrintCurrentLine(ByVal ex As Exception)
    Dim st As StackTrace = New StackTrace(ex)
    Dim sf As StackFrame = st.GetFrame(st.FrameCount - 1)
    Console.WriteLine("Line " & sf.GetFileLineNumber())
End Sub

Также помните, что если вы запускаете код с включенной оптимизацией, такие вещи, как номера строк, могли измениться. Вам всегда нужно включить файл PDB в ваш код, который содержит информацию отладки, которая используется в таких ситуациях. Он отображает оптимизированный код обратно на ваш первоначальный источник.

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

После прочтения нескольких ответов, которые я пришел для меня на следующее решение как эквивалентное макросу C ++ ЛИНИЯ

(New StackTrace(New StackFrame(True))).GetFrame(0).GetFileLineNumber())

который можно использовать, например, в качестве:

Console.WriteLine(String.Format("Executed on line# {0}", (New StackTrace(New StackFrame(True))).GetFrame(0).GetFileLineNumber()))

Скомпилированные сборки не будут иметь связанные с ними номера строк. Это не информация, которая является частью собраний.

Информация хранится в файле символов отладки - pdb файл.

От MSDN - Stacktrace Class:

Информация Stacktrace будет наиболее информативной с конфигурациями отладки. По умолчанию сборки отладки включают символы отладки, а сборки релиза - нет. Символы отладки содержат большую часть файла, имени метода, номера строки и информации столбца, используемой при конструировании объектов StackFrame и StackTrace.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top