码迷,mamicode.com
首页 > 其他好文 > 详细

调试教程

时间:2020-05-12 14:07:58      阅读:72      评论:0      收藏:0      [点我收藏+]

标签:空指针   ctr   右击   over   停止   tps   进一步   问题   如何   

程序崩溃的原因分类
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

调试教程

标签:空指针   ctr   右击   over   停止   tps   进一步   问题   如何   

原文地址:https://www.cnblogs.com/chendeqiang/p/12861548.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!