零基础调试的方法
毫无疑问,软件开发人员编写的代码并不总是按照预期行事。 有时它执行一些完全不同的操作! 发生这种情况时,下一个任务是找出原因。尽管我们可能会一直盯着代码看几个小时,但使用调试工具或调试程序会更轻松且更高效。
遗憾的是,调试程序无法神奇地揭示代码中的所有问题或“bug”。 调试意味着在 Visual Studio 等调试工具中逐步运行代码,以找到导致编程错误的确切位置 。 那么就可以了解代码中所需的更正,并且调试工具通常允许进行临时更改,以便可以继续运行该程序。
有效地使用调试程序也是一项需要时间和实践来学习的技能,但从根本上来说这是每个软件开发人员的一项基本任务。 本文随后将介绍调试的核心原则并提供入门提示。
通过问自己正确的问题来澄清问题
在尝试修复之前,这有助于阐明遇到的问题。 我们预计代码已出现了问题,否则你不会试图弄清楚对其进行调试的方法! 因此,开始调试之前,请确保你已确定要解决的问题:
期望代码可执行哪些操作?
相反,发生了什么?
如果运行应用时遇到了错误(异常),这可能是一件好事! 异常是运行代码时遇到的意外事件,通常是某种错误。 调试工具有助于找到代码中发生异常的确切位置并且帮助调查可能的修复方法。
如果发生了其他情况,问题的症状是什么? 是否已经怀疑代码中出现此问题的位置? 例如,如果代码显示了某些文本,但文本不正确,则你知道数据已损坏或设置显示文本的代码存在某种 bug。 通过逐步调试调试程序中的代码,可以检查变量的每个更改,以准确地发现分配时间以及分配不正确值的方式。
检查假设
在调查 bug 或错误之前,请考虑你期望获得某个结果的假设。 即使正在查看调试程序中问题的成因,隐藏或未知的假设也可能妨碍识别问题。 可能有一长串可能的假设! 以下是要询问的一些问题,以质疑你的假设。
是否使用正确的 API(即正确的对象、函数、方法或属性)? 正在使用的 API 可能无法按照你的想法执行操作。 (在调试程序中检查 API 调用之后,解决此问题可能需要转至文档以帮助识别正确的 API。)
是否正确地使用了 API? 也许使用了正确的 API,但方法不正确。
代码是否包含任何拼写错误? 很难发现某些拼写错误(例如变量名的简单拼写错误),尤其是在使用不需要在使用变量之前声明变量的语言时。
是否对代码进行了更改,并假设它与所看到的问题无关?
是否期望对象或变量包含与实际情况不同的特定值(或某种类型的值)?
是否知道代码的含义? 调试其他人的代码通常更加困难。 如果不是你的代码,则可能需要花时间准确地了解代码的作用,然后才能有效地进行调试。
提示
编写代码时,从小型代码开始,从有效的代码开始! (优秀的示例代码在此处很有用。)有时,通过从演示尝试实现的核心任务的一小段代码开始,可以更轻松地修复大型或复杂的代码集。 然后,可以以增量方式来修改或添加代码,从而在每个点测试错误。
Windbg常用命令系列---显示线程时间(.ttime)
.ttime (Display Thread Times)
ttime命令显示线程的创建时间,以及它在内核模式和用户模式下运行的时间。
.ttime
Visual Studio调试器指南----Autos窗口
当处于调试模式中断下,Autos窗口将自动显示变量。窗口里的变量是调试器自动添加的。
打开
- 通过菜单方式
- 快捷键
先按下: Ctrl+Alt+V,此时VS状态栏显示如下消息
在按下A键
窗口使用
在单步调试模式下,往下走一步,窗口里的内容如下
当某个变量是结构、类或数组时,可以点击左边的展开符号展开观察详细情况
双击“Value”列可编辑修改变量值
在本窗口区域点击右键,有如下菜单
- Copy
复制选择行所有列的内容 - Edit Value
编辑选择变量的值 - Hexadecimal Display
勾选上时十六进制显示
说明
本窗口不能自己添加要观察的变量。窗口里的变量会跟随执行进度显示当前行,前一行和后一行的变量。
Visual Studio调试器指南---Locals窗口
当处于调试模式中断下,Locals窗口将自动显示变量。窗口里的变量是调试器自动添加的。
打开
- 通过菜单方式
- 快捷键
Alt+4
窗口使用
在函数调用处,只显示函数的参数,进入函数体后,调试器会自动把所以变量加入
当某个变量是结构、类或数组时,可以点击左边的展开符号展开观察详细情况
双击“Value”列可编辑修改变量值
在本窗口区域点击右键,有如下菜单
- Copy
复制选择行所有列的内容 - Edit Value
编辑选择变量的值 - Hexadecimal Display
勾选上时十六进制显示
说明
本窗口不能自己添加要观察的变量。
Visual Studio调试器指南---QuickWatch窗口
当处于调试模式中断下,我们可以通过QuickWatch窗口快速查看我们想观察的变量、表达式的值
打开
- 通过菜单栏方式
- 代码窗口右键方式
- 快捷键
Shift+F9
窗口使用
- Expression
这里可以输入可计算表达式,也可以选择之前观察过的表达式。 - ReeValuate
重新计算,输入表达式点此按钮会进行计算 - Add Watch
将输入的表达式添加到"Watch窗口" - Value列表
显示表达式值信息。可以显示复杂结构。
如果是一个变量,可以双击Value列修改变量值
Value列表右键菜单
菜单项 跟其他观察窗口操作一样
说明
这个窗口一次只能观察一个表达式。且这是一个模态对话框。可以显示特定时刻变量的值
- 通过菜单方式