对于MicroStation的二次开发来说,掌握在线调试的技能十分有必要,因为如果采用对话框输出信息的方式,在查找错误的效率上来讲会大打折扣。本文基于VisualStudio2017进行讲解,对调试的步骤进行详细阐述,帮助您全面掌握调试的方法。
启动调试
对于MicroStation的二次开发来说,当我们需要对生成的dll文件进行调试时,首先需要确定,在配置一栏确定为Debug,否则无法进行调试。<br />![1643077568(1).png](https://cdn.nlark.com/yuque/0/2022/png/21640708/1643077578753-07dcf028-c140-4599-bb99-1505f0873dc3.png#clientId=u42ff3dbd-716c-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=420&id=u17d0ae4e&margin=%5Bobject%20Object%5D&name=1643077568%281%29.png&originHeight=420&originWidth=434&originalType=binary&ratio=1&rotation=0&showTitle=false&size=89700&status=done&style=none&taskId=u215b8c8a-f7f8-44db-ba8e-980089f7bb9&title=&width=434)<br />**图1 配置栏**<br /> 当我们编译后,会在mdlapps文件夹中生成对应的dll文件,此时我们点击调试(Debug)—附加到进程(Attach to Process...)**(快捷点:Ctrl+Alt+P)**,此时我们启动MicroStation,在列表中搜索MicroStation.exe进程,可使用搜索栏输入关键字,MicroStation。<br />(注意:若已启动MicroStation软件但未在进程列表中找到MicroStation.exe可点击刷新(Refresh))<br />![image.png](https://cdn.nlark.com/yuque/0/2022/png/21640708/1643078503429-10260346-d953-405a-9197-927882e73278.png#clientId=u42ff3dbd-716c-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=770&id=u0b55f128&margin=%5Bobject%20Object%5D&name=image.png&originHeight=770&originWidth=1086&originalType=binary&ratio=1&rotation=0&showTitle=false&size=107843&status=done&style=none&taskId=u4ef466d9-b4ef-4ac8-863c-e734649a221&title=&width=1086)<br />**图2 附加进程界面**
调试作用
图3 调试界面
通过调试我们在监视器中查看该进程运行过程中内存,CPU的使用状态,将鼠标停留在变量上,下方界面,或者使用监视(AddWatch)查看变量的属性值。
断点(Breakpoints)
断点用于通知调试器暂停程序的位置,可通过点击左边空白栏或点击F9在当前行添加/删除断点。一般会在出问题的位置或之前设置断点,然后使用调试工具分析出现问题的具体原因。<br />![image.png](https://cdn.nlark.com/yuque/0/2022/png/21640708/1643078909613-68ae2947-a40e-4382-8243-d9e16ecc3a82.png#clientId=u42ff3dbd-716c-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=383&id=ub9f965f6&margin=%5Bobject%20Object%5D&name=image.png&originHeight=383&originWidth=1039&originalType=binary&ratio=1&rotation=0&showTitle=false&size=139704&status=done&style=none&taskId=u5f2626ac-4bce-43b8-8fd3-7b95454acb2&title=&width=1039)<br />**图4 设置断点**
调试(Debug)
当我们的程序执行到这一行时,则程序会停在断点处,黄色箭头显示的是程序将要执行的条目,并等待调试操作。以下是几种调试功能,接下来我依次对其进行介绍。<br />![image.png](https://cdn.nlark.com/yuque/0/2022/png/21640708/1643079533612-4816c38d-2f82-42a9-a2ba-5e1e3a8bba52.png#clientId=u42ff3dbd-716c-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=231&id=ue6b534a1&margin=%5Bobject%20Object%5D&name=image.png&originHeight=231&originWidth=809&originalType=binary&ratio=1&rotation=0&showTitle=false&size=43736&status=done&style=none&taskId=u04afb73e-5c0e-4222-b5e8-f4091be04b7&title=&width=809)<br />**图5 调试**
逐过程(Step Over)
图6 逐过程调试
图7 逐过程按钮
逐过程(快捷键:F10)用于逐条执行代码,执行高亮的行,然后暂停,不会进入函数内部。
逐语句(Step Into)
基本与逐过程相似,他们的区别是若高亮语句是方法调用,调试器会进入方法内部。**(快捷键:F11)。**<br />![1643082211(1).png](https://cdn.nlark.com/yuque/0/2022/png/21640708/1643082223127-1ff8a26d-3dd1-400c-ab8a-6fb068870474.png#clientId=u42ff3dbd-716c-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=738&id=ue406f730&margin=%5Bobject%20Object%5D&name=1643082211%281%29.png&originHeight=738&originWidth=1903&originalType=binary&ratio=1&rotation=0&showTitle=false&size=370220&status=done&style=none&taskId=ubb6708f4-459b-4835-b6a7-22ad884582d&title=&width=1903)<br />**图8 逐语句调试**<br />![image.png](https://cdn.nlark.com/yuque/0/2022/png/21640708/1643083140315-31b386ae-ca22-46fd-857a-ab32d217ef70.png#clientId=u42ff3dbd-716c-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=102&id=u7def233d&margin=%5Bobject%20Object%5D&name=image.png&originHeight=102&originWidth=147&originalType=binary&ratio=1&rotation=0&showTitle=false&size=4706&status=done&style=none&taskId=ud1961bc1-fe87-46e7-b2e2-4f37e6f97bb&title=&width=147)<br />**图9 逐语句按钮**
跳出(Step Out)
当在一个方法内部调试时,若需要跳出整个个方法,则使用该功能后调试器会完成此方法中的执行,并跳出至调用此方法的语句的下一条语句暂停。**(快捷键:Shift+F11)**<br />![1643083329(1).png](https://cdn.nlark.com/yuque/0/2022/png/21640708/1643083416459-cfc4dd4f-1efa-4a14-806e-c2ee4b64b0dc.png#clientId=u42ff3dbd-716c-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=763&id=u282c9b69&margin=%5Bobject%20Object%5D&name=1643083329%281%29.png&originHeight=763&originWidth=1853&originalType=binary&ratio=1&rotation=0&showTitle=false&size=376411&status=done&style=none&taskId=ua8420e35-dd7a-46d4-9a28-fe624d6e783&title=&width=1853)<br />**图10 跳出调试**<br />![image.png](https://cdn.nlark.com/yuque/0/2022/png/21640708/1643083488412-e21d8db7-a7fd-41b2-8fbe-81acd0eb2307.png#clientId=u42ff3dbd-716c-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=100&id=u65d5676d&margin=%5Bobject%20Object%5D&name=image.png&originHeight=100&originWidth=214&originalType=binary&ratio=1&rotation=0&showTitle=false&size=5320&status=done&style=none&taskId=u9b087d8a-7aae-4c4c-8901-0468408556f&title=&width=214)<br />**图11 跳出按钮**
继续(Continue)
当使用继续时,他会继续程序的执行直到结束或遇到下一个断点停止。**(快捷键:F5)**<br />![1643083609(1).png](https://cdn.nlark.com/yuque/0/2022/png/21640708/1643083614919-227ccb25-4ad2-4044-8ac3-8cbdd1b932da.png#clientId=u42ff3dbd-716c-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=530&id=u46721b0e&margin=%5Bobject%20Object%5D&name=1643083609%281%29.png&originHeight=530&originWidth=1437&originalType=binary&ratio=1&rotation=0&showTitle=false&size=450927&status=done&style=none&taskId=u7cf91c35-76b4-48b5-a879-87eb8fd0950&title=&width=1437)<br />**图12 继续调试**<br />![image.png](https://cdn.nlark.com/yuque/0/2022/png/21640708/1643089257156-81c3d4c1-9019-4c55-9cd9-97e7ff6b2ff9.png#clientId=u94fa6dc5-4e96-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=160&id=uf4f87654&margin=%5Bobject%20Object%5D&name=image.png&originHeight=160&originWidth=426&originalType=binary&ratio=1&rotation=0&showTitle=false&size=7610&status=done&style=none&taskId=uec941ef2-796f-4de2-90c6-e189acf7cf9&title=&width=426)<br />**图13 继续按钮**
设置下一语句(Set Next Statement)
该语句可以改变程序的执行路径,该功能课直接跳转至指定行,这样程序就会转到指定行而不执行先前代码。当我们确认某一个方法会导致程序的崩溃,我们可以使用该功能跳过会导致崩溃的方法后继续调试后续代码。使用拖拽箭头的方式也可以达到同样效果。**(快捷键:Ctrl+Shift+F10)**<br />![image.png](https://cdn.nlark.com/yuque/0/2022/png/21640708/1643089218870-a9eaa0de-16a2-43a8-9fda-6f399c16ec6c.png#clientId=u94fa6dc5-4e96-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=801&id=ub2724160&margin=%5Bobject%20Object%5D&name=image.png&originHeight=801&originWidth=1037&originalType=binary&ratio=1&rotation=0&showTitle=false&size=188165&status=done&style=none&taskId=udb9c9d2c-70db-41d3-a666-dd69dc0a07a&title=&width=1037)<br />**图14 设置下一语句调试**