zoukankan      html  css  js  c++  java
  • 代码调试

    1、使用调试工具确定段错误的位置;

      当发生段错误时,执行的第一步操作应该是在调试器中运行程序并从重新产生段错误; 调试器将指出发生这种错误的代码行。 然后,可以通过调用调试器的反向跟踪(backtrace)功能获得其他有用信息。该功能显示导致调用引发错误的函数的调用序列;

    2、通过发出中断确定无限循环的位置

      如果怀疑程序中在无限循环,则进入调试器并再次运行程序,让该程序执行足够常的时间以进入循环;然后,使用调试器的终端命令挂起该程序。并且执行反向跟踪;

    为了以TUI模式下运行GDB,可以在调用GDB时在命令行上指定-tui选项;

    TUI模式下,方向键用于滚动源代码子窗口,可以使用Ctrl+P 和Ctrl+N组合键来浏览以前的GDB命令。

    list命令更改源代码子窗口中显示的代码区域;

    GDB中创建特殊类型的一次性断点的命令: until   和  finish;

    3、检查变量

      当调试器件暂停了程序的执行后,可以执行一些命令来显示程序变量的值。这些变量可以是局部变量、全局变量、数组的元素、和c语言的struct、c++中的成员变量等。

       GDB中使用print命令输出当前值;

      

    4、设置监视点以应对变量值的改变

      监视点结合了断点和变量检查的概念。最基本形式的监视点同时调试器,每当指定变量的值发生改变时都暂停程序的执行;

    例如:在程序执行期间,假设要在变量z改变值时查看程序的状态,在GDB中,可以执行如下命令:

          watch  z

      当程序运行时,每当z的值发生变化,GDB都会暂停执行;

    更好的方法是:可以基于条件变量来设置监视点。例如,要查找程序执行期间z的值大于28的第一个位置,可以通过设置一个基于表达式(z > 28)的监视来完成这件事;

    在GDB中输入: watch  (z>28)

    5、上下移动调用栈

      在函数调用期间,与调用关联的运行时信息存储在称为栈帧(stack frame)的内存区域中。帧中包含函数的局部变量的值、其形参、以及调用该函数的位置记录。每次发生函数调用时,都会创建一个新帧,并将其推到一个系统维护的栈上;栈最上方的帧表示当前正在执行的函数,当函数退出时,这个帧被弹出帧,并且被释放;

      在GDB中可以用frame命令查看以前的帧:

        frame   1

      当执行GDB的frame命令时,当前正在执行的函数的帧被编号为0,其父帧(即该函数的调用者的栈帧)被编号为1, 父帧的父帧被编号为2,以此类推。GDB的up命令将你带到调用栈中的下一个父帧; down则引向相反方向。

      如上操作非常有用,因为根据以前的一部分栈帧中的局部变量的值,可能发现一些引起程序错误的线索;

    GDB的backtrace命令显示整个栈,即当前存在的所有帧的集合;

    6、联机帮助

      在GDB中,可以通过help命令访问文档。

        help  breakpoints

      将显示关于断点的文档。

    7、GCC中可以用-g选项让编译器将符号表(即对应于程序的变量和代码行的内存地址列表)保存在生成的可执行文件中。这是一个绝对必要的步骤,这样才能在调试会话过程中应用源代码中的变量名和行号。

      如果没有这一步,就不能要求调试器“在第30行处停止” 或者“输出x的值”

    GDB方法:

      为了跟踪第一个程序错误,在GDB中执行这个程序,并在按Ctrl+c组合键挂起程序之前让它运行一会儿,然后看看这时停留在何处,用这种方式可以确定无限循环的位置;

      首先,对insert_sort 启动GDB调试器

      $ gdb  xxx    insert_sort  -tui

    最上面的子窗口显示了部分源代码,在最下面的子窗口中有等待输入命令的GDB提示符

    条件断点:

      condition  1  num_y == 1  只有当满足条件num_y == 1时,GDB才会暂停程序的执行;

    注意, 与接受行号(或函数名)的break命令不同, condition接受断点号。 总是可以用命令info break  来查询要查找的断点的编号;

      clear命令删除断点;

  • 相关阅读:
    Java3D实例应用载入VRML模型
    Tomcat数据库连接池的配置方法总结
    WebGL学习笔记使用3D引擎threeJS实现星空粒子移动
    mybatis应用实例学习
    springmvc 实例应用
    springmvc定制伪REST风格及JSR303Bean校验整合
    SpringMVC中应用Ajax异步通讯
    Java3D实例应用载入3ds 模型
    Device Mutipath参数设置
    Nginx+FastCGI+Python
  • 原文地址:https://www.cnblogs.com/chris-cp/p/3778555.html
Copyright © 2011-2022 走看看