Из этого урока вы узнаете как использовать отладчик Visual Studio для пошагового выполнения кода, чтобы следить за выполнением программы; а также отслеживать значения переменных по мере выполнения кода.
Редко с первого раза можно написать отлично работающую программу. Даже если вы не допустили ошибок, которые не позволят Visual Studio создать ваш плагин, вполне вероятно, что вы допустили ошибку в программной логике, которая заставляет выводить неожиданные результаты. Ошибки в вашем коде называются багами, а процесс анализа вашего кода, изучающий ход выполнения программы и значения переменных, называется отладкой (дебагинг).
Чтобы отладить код вашего плагин, вам придётся запустить AutoCAD из вашего отладчика Visual Studio и запустить ваш плагин в AutoCAD*.
* Если вы используете примеры готовых проектов, а не начинаете с нуля и шагов, описанных здесь, предполагается, что вы установили AutoCAD в папку C: \ Program Files \ Autodesk \ AutoCAD 20xx. Если место папки установки AutoCAD отличается, то для отладки завершённых примеров проектов вы должны выполнить следующие шаги.
Это легко сделать в профессиональных версиях Visual Studio – параметр My Project позволяет вам установить исполняемый файл для запуска при запуске отладчика:
Однако этот функционал не отображается через среду IDE Visual Studio. Именно поэтому вы создали свой проект в уроке 1 с помощью мастеров AutoCAD c помощью AutoCAD.NET Wizard, вместо того, чтобы создавать его используя библиотеки классов. Если вы установите правильное расположение AutoCAD в диалоговом окне конфигурации, этот параметр будет создан, даже если вы не можете изменить его через пользовательский интерфейс Visual Studio.
Если по какой-то причине Wizard не установил это корректно или вы решили использовать проект Class Library, вы можете вручную настроить AutoCAD 20xx на запуск отладчиком, выполнив следующие инструкции.
Запуск отладчика
Если вы закрыли Visual Basic .NET IDE, запустите её снова и откройте проект, который вы сохранили в уроке 1.
Чтобы начать процесс отладки, просто откройте меню Debug и выберите Start debugging или нажмите F5. Это запустит AutoCAD 20хх из вашего отладчика.
Вы должны запустить AutoCAD таким образом, чтобы ваш отладчик мог подключиться к процессу AutoCAD, чтобы отслеживать выполнение кода, который вы скомпилировали в свой подключаемый DLL.
Если во время этого у вас открыто окно Visual Studio Community Immediate, вы увидите много текста, пролистывающего это окно. Некоторые части этого текста выглядят страшно, так как содержат в себе слово «error». Не беспокойтесь об этом. Этот текст носит информационный характер – он не означает что есть проблемы с AutoCAD или вашим плагином.
Как только AutoCAD будет готов, загрузите плагин с помощью команды NETLOAD, как в 1 уроке. Однако, поскольку сейчас вы проводите отладку, Visual Studio Community создал «отлаженую» версию вашего .NET плагина DLL. Если вы сохранили свой проект в C:\test, то путь для загрузки бует:
C:\test\KeepAttributesHorizontal\KeepAttributesHorizontal\bin\Debug\KeepAttributesHorizontal.dll
Помните, что DLL, загруженный в 1-ом уроке, находилась в папке bin\Release. Когда вы создадите окончательную версию вашего DLL-плагина, который вы хотите предоставить своим пользователям и клиентам Visual Studio создаст версию для релиза. Visual Studio оптимизирует скомпилированный код с сборке для релиза, чтобы он работал быстрее и занимал меньше памяти. Когда вы хотите отладить свой код, Visual Studio создаёт отладочную версию вашего DLL плагина. Версия для отладки не оптимизирована в плане скорости/памяти, а также содержит дополнительную информацию, которую использует отладчик, чтобы рассказать вам о том, что происходит при запуске кода.
Теперь откройте тестовый файл BlocksWithAttributes.dwg
Контрольные точки.
Теперь ваш DLL плагин готов к отладке. Но прежде чем вы запустите команду KEEPSTRAIGHT, вы должны сообщить отладчику, где вы хотите, чтобы он остановился во время выполнения кода. Для того используются контрольные точки.
В Visual Studio дважды щёлкните мышью по MyCommands.vb в обозревателе решений, чтобы отобразить код и щёлкнуть в любом месте строки:
Public Shared Sub ImplementOverrule()
Далее выберите Toggle Breakpoint в меню Debug (или нажмите F9).
Теперь эта линия будет выделена красным цветом, а с краю появится красный круг, показывающий, что вы установили контрольную точку на этой строке:
Установите контрольную точку для функции TransformBy таким же образом:
Public Overrides Sub TransformBy(ByVal entity As Entity,
ByVal transform As Matrix3d)
Когда AutoCAD обращается к этим методам в вашем коде, отладчик останавливается на этих строках и ждёт, пока вы скажете, что делать дальше.
Выполнение кода.
Теперь пришло время вызвать вашу команду. Введите KEEPSTRAIGHT в командной строке AutoCAD, а затем нажмите Enter. Далее запускается Visual Studio (если этого не произошло, запустите его при помощи иконки на рабочем столе Windows). Отладчик остановлен в ожидании, выделив жёлтым цветом и стрелкой в поле ниже сроки, которая будет выполнена далее. Атрибут CommandMethod сообщает AutoCAD, что он должен запустить ваш метод KEEPSTRAIGHT, поэтому отладчик остановился на контрольной точке, которую вы установили в начале этого метода.
Теперь вы готовы выполнить свой код. В меню отладки Visual Studio есть три способа выполнить свой код: Step Into; Step Over и Step Out. В основном вы будете использовать Step Over – он выполняет строку кода (выделенную жёлтым цветом) в отладчике, а затем переходит к следующей строке. Если строка кода, которая должна быть выполнена, вызывает метод, то Step Over выполняет весь метод. Если вы хотите выполнить вызываемый метод по одной строке за шаг, вы можете использовать Step Into; и вы можете использовать Step Out для перемещения назад (из метода) к коду, который вы первоначально отлаживали.
Так же, как и в меню Debug, вы можете найти значки Step Into, Step Over и Step Out на панели инструментов, а ещё каждая из них имеет сочетание горячих клавиш (F8, Shift + F8 и Ctrl + Shift + F8).
А сейчас нажмите на значок Step Over на панели инструментов. Отладчик перейдёт к следующей строке кода (игнорируя комментарии).
Эта строка является началом условного оператора. Код между If… Then и End If выполняется только в том случае, если логическое условие между If и Then определяется как True. Наведите указатель мыши на текст myOverrule. Появилась всплывающая подсказка с указанием значения переменной.
Чтобы отображать значения переменных, вы также можете щёлкнуть правой кнопкой мыши на переменной в вашем коде и выбрать Add Watch. Теперь переменная и её значение будет отображаться в окне Watch в нижней части экрана.
Отладчик сообщает вам, что значение myOverrule в данный момент отсутствует. Это и не удивительно, так как вы первый раз запустили функцию. На основе информации, сообщённой вам отладчиком, будет ли выполнятся код внутри оператора If?
Правильно – будет – так как myOverrule имеет значение Nothing и это True (истинно).
Просмотрите код шаг за шагом, останавливаясь на значениях и свойствах переменных, чтобы посмотреть, как они меняются по мере выполнения кода. Если вы захотите отключить построчную отладку, просто нажмите F5, чтобы перейти к следующей контрольной точке, — это нужно сделать, когда вы дойдёте до конца метода ImplementOverrule ().
Теперь вы закончили выполнение своей пользовательской команды, теперь пришло время отладить запуск программы. Если AutoCAD не запустился автоматически, запустите его с иконки на рабочем столе. Введите ROTATE, в командной строке и нажмите Enter, выберите блок и назначьте точку вращения.
Как только вы выберете точку вращения, отладчик должен дойти до контрольной точки переопределённого метода TransformBy. Просмотрите этот код, проверяя значения переменных по мере прохождения по коду:
— Обратите внимание на значение переменной, которое передаётся функции. Отладчик сообщает что тип AttributeReference – переменная типа Entity содержащая объект типа AttributeReference. Помните о том, что вы узнали о наследовании в третьем уроке.
— Наведите курсор мыши на переменную. Нажмите на значок «+» слева от значения переменной во всплывающей подсказке, чтобы развернуть её окно. Так можно запрашивать общедоступные свойства этого экземпляра класса Matrix3d, который сообщает вам значения для каждого элемента матрицы, а также систему координат, представляемую матрицей. (Не переживайте, если вы не понимаете матричную геометрию – здесь вы можете просматривать свойства переменных в отладчике).
— Проверьте значение свойства attRef.Rotation непосредственно перед и после выполнения этой строки кода.
Если вы нажмёте F5, то обнаружите что AutoCAD вызывает TransformBy (). Это связано с тем, что AutoCAD закрепляет объект – он преобразует вставленный блок каждый раз, когда вы перемещаете мышь. Нажмите на строку, в которой вы добавили контрольную точку для функции TransformBy (), и нажмите F9, чтобы отключить её. Нажмите F5 ещё раз, и отладчик отладчик отменит остановку AutoCAD. Завершите команду ROTATE, щёлкнув в окне чертежа, для выбора угла поворота.
Наконец, снова вызовите команду KEEPSTRAIGHT. Проверьте значение myOverrule в начале инструкции If и посмотрите, как отладчик идёт по другому пути через ваш код во второй раз, когда вы запускаете этот метод.
Когда закончите экспериментировать, выберите Stop Debugging в меню Debug, чтобы закрыть AutoCAD и завершить сеанс отладки.
Поздравляю! Теперь вы знаете как совершать отладку проекта в Visual Studio.
Дополнительное упражнение.
Чтобы потренироваться с процессом отладки, создайте новый проект плагина и вставьте нижеприведённый код в MyCommands.vb. Код основан на примерах, рассмотренных в уроке 3, для демонстрации концепций объектно-ориентированного программирования. Запустите новый проект ObjectOrientedSample.
— установите контрольную точку в начале метода Test ();
— запустите AutoCAD из отладчика;
— загрузите при помощи команды NETLOAD ObjectOrientedSample.dll из подпапки проекта bin\debug.
— Запустите команду RUNTEST в командной строке AutoCAD, а затем используйте операции отладки, которые вы изучили в этом уроке, для изучения исполнения кода и просмотра значения переменных.
Вот код:
Imports Autodesk.AutoCAD.Runtime
Namespace ObjectOrientedSample
Public Class MyCommands
<CommandMethod(«RunTest»)>
Public Sub Test()
Dim pt1 As Point = New Point
‘ USe Step Into on the next line to step into SetLocation
pt1.SetLocation(10, 10)
Dim xVal1 As Integer = pt1.X
pt1.X = 9
Dim xVal2 As Integer = pt1.X
Dim pt2 As NewPoint = New NewPoint
‘ SetLocation, X and Y are inherited from Point class
pt2.SetLocation(20, 20)
Dim xVal3 As Integer = pt2.X
pt2.X = 9
‘ Z is new to the NewPoint class
pt2.Z = 12
Dim pt3 As Point = pt2
‘ pt3 is variable of type Point, but holds an object of type NewPoint
End Sub
End Class
Public Class Point
Private mXCoord As Integer
Private mYCoord As Integer
Public Sub SetLocation(ByVal x As Integer, ByVal y As Integer)
Me.mXCoord = x
Me.mYCoord = y
End Sub
Public Property X() As Integer
Get
Return Me.mXCoord
End Get
Set(ByVal value As Integer)
Me.mXCoord = value
End Set
End Property
Public Property Y() As Integer
Get
Return Me.mYCoord
End Get
Set(ByVal value As Integer)
Me.mYCoord = value
End Set
End Property
End Class
Public Class NewPoint
Inherits Point
Private mZCoord As Integer
Public Property Z() As Integer
Get
Return Me.mZCoord
End Get
Set(ByVal value As Integer)
‘ Don’t accept negative Z values
If value >= 0 Then
Me.mZCoord = value
End If
End Set
End Property
End Class
End Namespace