代码调试

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命令删除断点;

 

 

 

 

 

 

时间: 2024-07-30 20:26:45

代码调试的相关文章

jsp java mysql-基于jsp的网上书店系统代码调试

问题描述 基于jsp的网上书店系统代码调试 从网上下载了一个网上书店系统的代码,导入到myeclipse中好多错误,数据库用的是mysql,我只学了一点点jsp的内容,自己不会调,这个系统我急着用,谁能帮我弄一下,可以加我qq帮我远程调一下吗?谢谢了~qq:1096273561 解决方案 你可以把项目发给我么?2970569542@qq.com这个邮箱里面,我帮你看看

JavaScript代码调试方法总结

JavaScript 调试 没有调试工具是很难去编写 JavaScript 程序的;你的代码可能包含语法错误,逻辑错误,如果没有调试工具,这些错误比较难于发现;通常,如果 JavaScript 出现错误,是不会有提示信息,这样你就无法找到代码错误的位置 JavaScript 调试工具 在程序代码中寻找错误叫做代码调试.调试很难,但幸运的是,很多浏览器都内置了调试工具;内置的调试工具可以开始或关闭,严重的错误信息会发送给用户 浏览器启用调试工具一般是按下 F12 键,然后通过console调试 c

arm-基于lpc2114做sht11在lcd1602显示代码调试驱执行不了,求大神指教

问题描述 基于lpc2114做sht11在lcd1602显示代码调试驱执行不了,求大神指教 /**************************************************************************** 基于LPC2114做的一个SHT11温湿度传感器在LCD1602显示 ****************************************************************************/ #include "con

《深入理解Android》一1.4 WebKit代码调试

1.4 WebKit代码调试 Android平台WebKit的调试分析的常用手段包括打印log.remote gdb调试以及分析crash dump等,下面分别介绍. (1)打印log,将系统的运行信息输出到log系统 WebKit 代码量较大,很多逻辑非常复杂,单纯的断点调试,很难直观看到想要观察的数据.一方面对于一些嵌套非常强的逻辑,如递归等,使用断点调试很难直观看到相互关系.WebKit中一个典型的递归应用就是对Render树等树形结构的遍历,如果我们要打印出一棵Render树的各个节点,

开源代码调试 Stereo Matching IEEE 2009

问题描述 开源代码调试 Stereo Matching IEEE 2009 各位大神有木有人调试成功过<Stereo Matching with Nonparametric Smoothness Priors in Feature Space>的开源代码呀?求帮助 解决方案 给个链接我给调试一下看看,stereo 的东西我在做

我的女神——简洁实用的iOS代码调试框架

我的女神--简洁实用的iOS代码调试框架 一.引言         这篇博客的起源是接手了公司的一个已经完成的项目,来做代码优化,项目工程很大,并且引入了很多公司内部的SDK,要搞清楚公司内部的这套框架,的确不是件容易的事,并且由于这个项目是多人开发的,在调试阶段会打印出巨量的调试信息,使得浏览有用信息变的十分困难,更加恐怖的是,很多信息是SDK中的调试打印,将这些都进行注销是非常费劲甚至不可能的事,于是便有了这样一些需求:首先,我需要清楚了解各个controller之间的跳转关系,需要快速的弄

webstorm中代码调试扩展问题

问题描述 webstorm中代码调试扩展问题 jetbrains ide support extension下载下来打开添加总是显示无法添加该扩展. 解决方案 http://www.bkjia.com/HTML5/442248.html 解决方案二: Orange'S代码用gdb+bochs调试的问题

ios-AppCan中 iOS原生代码 调试插件 中出现的问题

问题描述 AppCan中 iOS原生代码 调试插件 中出现的问题 在调试插件过程中 index.html中的 按钮可以调用createDemo(); 但是createDemo();中得uexDemo.open是怎么回调的? function createDemo(){ alert("----"); uexDemo.open('0','120','320','416'); } uexDemo在plugin.xml中写了 <?xml version="1.0" e

高手写的Tracer-Flash代码调试类代码下载_Flash As

AS3]Tracer-Flash代码调试类 组件版本:1.0 功能简述:可以在脱离flash编辑状态下进行调试代码(功能类似于trace命令).  运行平台:Flash CS3,ActionScript3,Flash Player 9 +  调用接口: 复制代码 代码如下: public interface com.klstudio.util.Tracer {      //是否为控制台端;      function isConsole():Boolean      //调试AS代码;    

java代码调试

问题描述 java运行代码调试时,为什么不能对.class里面的变量过程进行跟踪监视?请问各位大神,如何跟踪监视.class文件里的运算过程? 解决方案 解决方案二:没见过,字节码文件怎么看,一般都是对这个.class文件对应的java文件进行调试解决方案三:也很纳闷这点,为什么已经编译.class文件可以看得到,和.java是一模一样的.解决方案四:引用2楼le_zhou的回复: 也很纳闷这点,为什么已经编译.class文件可以看得到,和.java是一模一样的. 不会吧编译后.class的文件