zoukankan      html  css  js  c++  java
  • 调试教程

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

  • 相关阅读:
    写页面得来的体会
    C#&java重学笔记(面向对象)
    C#&java重学笔记(函数)
    C#&java重学笔记(变量与操作符)
    深入JS第一天:原型和它的小伙伴们(一)
    兼容性积累
    再深入一点ajax
    Android之内存泄漏调试学习与总结
    优雅地实现Android主流图片加载框架封装,可无侵入切换框架
    优雅地实现Android主流图片加载框架封装,可无侵入切换框架
  • 原文地址:https://www.cnblogs.com/chendeqiang/p/12861548.html
Copyright © 2011-2022 走看看