调试教程
Posted chendeqiang
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了调试教程相关的知识,希望对你有一定的参考价值。
程序崩溃的原因分类
1.函数栈溢出?
一个变量未初化、未赋值,就读取它的值。?
( 这属于逻辑问题,往往是粗心大意的导致的 )
2.函数栈溢出?
(1)定义了一个体积太大的局部变量?
(2)函数嵌套调用,层次过深(如无穷递归)
3.数组越界访问?
访问数组元素时,下标越界
4.指针的目标对象不可用?
(1)空指针?
(2)野指针?
指针未赋值,free/delete释放了的对象,不恰当的指针强制转换
一、导言
在软件开发周期中,测试和修正缺陷(defect,defect与bug的区别:Bug是缺陷的一种表现形式,而一个缺陷是可以引起多种Bug的)的时间远多于写代码的时间。通常,debug是指发现缺陷并改正的过程。修正缺陷紧随debug之后,或者说二者是相关的。如果代码中存在缺陷,我们首先要识别造成缺陷的根本原因(root cause),这个过程就称作调试(debugging)。找到根本原因后,就可以修正缺陷。
那么如何调试代码呢?Visual Studio提供了很多用于调试的工具。有时调试需要花费大量时间去识别root cause。VS提供了许多辅助调试的便捷的工具。调试器(Debugger)包含错误列表、添加断点、可视化的程序流程、控制执行流程、Data Tips、监视窗口(watch windows)、多线程调试、线程窗口、并行调试概览以及IntelliTrace调试概览。我希望本文能够对调试功能的使用者有所裨益。请注意,本文使用VS2010。某些功能在旧版本中也是一致的,但是VS2010新增了许多features(Labeling breakpoint, Pinned DataTip, Multithreaded Debugging, Parallel debugging and IntelliTrace)。
二、VS调试
可以通过VS的调试(Debug)菜单启动调试。点击调试菜单下的“启动调试”或者按F5键启动。如果你已经在代码中加入了断点,那么执行会自动开始。
“附加到进程(Attach to Process)”是另一种启动调试的方法。附加到进程可以跳过调试运行中的程序而不是vs中的程序。
通常我们通过在可能存在问题代码处加断点来启动调试。因此,我们从断点开始讲起。
断点用于通知调试器何时何处暂停程序的执行。通过点击左边栏或者按F9键在当前行添加断点。在加断点之前,你需要知道你的代码将会出现什么错误,在什么地方停止执行。当调试器执行到断点处时,你可以使用其他的调试工具核对代码何处出现错误。
2.1 使用断点进行调试
你已经在你想要暂停执行的地方设置了断点。现在按F5键启动调试,当程序执行到断点处时,自动暂停执行。此时你有多种方式来检查代码。命中断点(hit the breakpoint)后,加断点的行变为黄色,意指下一步将执行此行。
在中断模式下,你有多条可使用的命令,使用相应命令进行进一步的调试。
2.1.1 逐过程(Step Over)
调试器执行到断点后,你可能需要一条一条的执行代码。”Step Over“[F10]命令用于一条一条的执行代码。这将执行当前高亮的行,然后暂停。如果在一条方法调用语句高亮时按F10,执行会停在调用语句的下一条语句上。Step Over会一次整个方法。
2.1.2 逐语句(Step Into)
它与Step Over相似。唯一的不同是,如果当前高亮语句是方法调用,调试器会进入方法内部。快捷键是”F11“。
2.1.3 跳出(Step Out)
当你在一个方法内部调试时会用到它。如果你在当前方法内按Shift - F11,调试器会完成此方法的执行,之后在调用此方法的语句的下一条语句处暂停。
2.1.4 继续(Continue)
它像是重新执行你的程序。它会继续程序的执行直到遇到下一个断点。快捷键是”F5“。
2.1.5 设置下一语句(Set Next Statement)
这是一个非常有趣的特性。设置下一语句允许你在调试的时候改变程序的执行路径。如果你的程序在某一行处暂停而且你想改变执行路径,跳到指定行,在这一行上右击,在右击菜单中选择”设置下一语句“。这样程序就会转到哪一行执行而不执行先前的代码。这在如下情况中非常有用:当你发现代码中某些行可能会导致程序的中断(break)而你不想让程序在那个时候中断。快捷键是Ctrl + Shift + F10。
2.1.6 显示下一语句
这一行用黄色箭头标记。这行是程序继续执行时下一条将执行的语句。
2.2 断点标签(Labeling in Break Point)
这是VS2010提供的新特征(feature)。用于更好的管理断点。它使得我们能够更好的分组和过滤断点。这像是对断点的归类。如果我们添加了与某一功能相关的不同类型的断点,我们可以根据需要使能(enable)、取消(disable)、过滤(filter)这些断点。
断点标签到此介绍完毕。我举的例子非常简单,但是断点标签在你调试大量代码,多个工程等情况下非常有用。
2.3 条件断点(Conditional Breakpoint)
假设你在多次迭代(循环)处理数据而你只想调试其中某几次迭代。这意味着你想根据某些特定条件暂停你的程序。Visual Studio断点允许你设置条件断点。当且仅当条件满足时,调试器才会停住。
首先,你需要在你想暂停执行处设置断点。然后右击红色的断点图标。右键菜单中点击”条件“。
点击右键菜单中的”条件“后,会弹出下面的对话框设置断点的条件。
测试代码:
#include <iostream>
#include <vector>
void add( int& aaa);
int main() {
int aa(0);
aa++;
aa++;
aa++;
aa++;
add(aa);
system("pause");
return 0;
}
void add( int& aaa)
{
aaa++;
aaa++;
aaa++;
}
三、QT测试
我们打开Qt界面程序的主窗口
我们将编辑的窗口切换到Debug的窗口
点击那个甲虫的标志
下面绿色的播放按钮是编译运行,带甲虫标志的是调试编译运行
在右上角我们可以看到变量值的信息
我们在程序的适当位置添加断点
然后再点击编译运行
发现程序黄色的进度条停止在断点那里
而变量窗口也有我们需要的信息了
我们可以单击下面的单步运行查看变量值的变化是否正确
我们在变量窗口点击Add 可以添加那里原本没有的变量
参考链接:
https://blog.csdn.net/qq_35637562/article/details/79369034
https://jingyan.baidu.com/article/95c9d20d726eeeec4e756108.html
以上是关于调试教程的主要内容,如果未能解决你的问题,请参考以下文章