как распечатать номер строки во время запуска приложения в VB.net - PullRequest
1 голос
/ 28 апреля 2011

Я хотел бы распечатать свое отладочное сообщение с номером строки в приложении 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'.

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

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

Ответы [ 3 ]

3 голосов
/ 28 апреля 2011

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

Здесь важен 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 с вашим кодом, который содержит отладочную информацию, которая используется в подобных ситуациях. Он отображает оптимизированный код обратно в ваш исходный код.

2 голосов
/ 15 сентября 2013

Прочитав несколько ответов, я пришел к следующему решению, эквивалентному макросу C ++ LINE

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

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

Console.WriteLine(String.Format("Executed on line# {0}", (New StackTrace(New StackFrame(True))).GetFrame(0).GetFileLineNumber()))
1 голос
/ 28 апреля 2011

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

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

Из MSDN - Класс StackTrace :

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

...