毫无疑问,软件开发人员编写的代码并不总是按照预期行事。 有时它执行一些完全不同的操作! 发生这种情况时,下一个任务是找出原因。尽管我们可能会一直盯着代码看几个小时,但使用调试工具或调试程序会更轻松且更高效。
遗憾的是,调试程序无法神奇地揭示代码中的所有问题或“bug”。 调试意味着在 Visual Studio 等调试工具中逐步运行代码,以找到导致编程错误的确切位置 。 那么就可以了解代码中所需的更正,并且调试工具通常允许进行临时更改,以便可以继续运行该程序。
有效地使用调试程序也是一项需要时间和实践来学习的技能,但从根本上来说这是每个软件开发人员的一项基本任务。 本文随后将介绍调试的核心原则并提供入门提示。
通过问自己正确的问题来澄清问题
在尝试修复之前,这有助于阐明遇到的问题。 我们预计代码已出现了问题,否则你不会试图弄清楚对其进行调试的方法! 因此,开始调试之前,请确保你已确定要解决的问题:
-
期望代码可执行哪些操作?
-
相反,发生了什么?
如果运行应用时遇到了错误(异常),这可能是一件好事! 异常是运行代码时遇到的意外事件,通常是某种错误。 调试工具有助于找到代码中发生异常的确切位置并且帮助调查可能的修复方法。
如果发生了其他情况,问题的症状是什么? 是否已经怀疑代码中出现此问题的位置? 例如,如果代码显示了某些文本,但文本不正确,则你知道数据已损坏或设置显示文本的代码存在某种 bug。 通过逐步调试调试程序中的代码,可以检查变量的每个更改,以准确地发现分配时间以及分配不正确值的方式。
检查假设
在调查 bug 或错误之前,请考虑你期望获得某个结果的假设。 即使正在查看调试程序中问题的成因,隐藏或未知的假设也可能妨碍识别问题。 可能有一长串可能的假设! 以下是要询问的一些问题,以质疑你的假设。
-
是否使用正确的 API(即正确的对象、函数、方法或属性)? 正在使用的 API 可能无法按照你的想法执行操作。 (在调试程序中检查 API 调用之后,解决此问题可能需要转至文档以帮助识别正确的 API。)
-
是否正确地使用了 API? 也许使用了正确的 API,但方法不正确。
-
代码是否包含任何拼写错误? 很难发现某些拼写错误(例如变量名的简单拼写错误),尤其是在使用不需要在使用变量之前声明变量的语言时。
-
是否对代码进行了更改,并假设它与所看到的问题无关?
-
是否期望对象或变量包含与实际情况不同的特定值(或某种类型的值)?
-
是否知道代码的含义? 调试其他人的代码通常更加困难。 如果不是你的代码,则可能需要花时间准确地了解代码的作用,然后才能有效地进行调试。
提示
编写代码时,从小型代码开始,从有效的代码开始! (优秀的示例代码在此处很有用。)有时,通过从演示尝试实现的核心任务的一小段代码开始,可以更轻松地修复大型或复杂的代码集。 然后,可以以增量方式来修改或添加代码,从而在每个点测试错误。
通过质疑假设,可以减少在代码中查找问题所需的时间。 此外可缩短解决问题所需的时间。
在调试模式中单步调试代码以查找问题发生的位置
正常运行应用时,仅在代码运行后才能看到错误和不正确的结果。 程序也可能会意外终止而不告知原因。
在调试程序中运行应用(也称为“调试模式”),这意味着调试程序会主动监视程序运行时发生的所有事情 。 此外允许在任何时候暂停应用以检查其状态,然后逐行单步调试代码以查看发生的每个细节。
在 Visual Studio 中,通过使用调试工具栏中的 F5(或“调试” > “开始调试”菜单按钮或“开始调试”按钮来进入调试模式) 。 如果发生任何异常,则 Visual Studio 的异常帮助程序会找到发生异常的确切位置,并提供其他有用信息。 有关如何在代码中处理异常的详细信息,请参阅调试技术和工具。
如果未收到异常,则你可能清楚在代码中查找问题的位置。 可在此处结合使用断点 和调试器,这样便有机会更仔细地检查代码。 断点是可靠调试的最基本和最重要的功能。 断点指示 Visual Studio 应在何处暂停正在运行的代码,以查看变量的值或内存的行为,或代码运行的顺序。
在 Visual Studio 中,可通过单击代码行旁边的左边距来快速设置断点。 或将光标置于行并按 F9 。