程序调试基础

tt posted @ 2007年8月07日 22:59 in 程序调试 , 2503 阅读

在Linux下调试程序,一般用gdb,也有可视化的工具ddd和insight

由于这段时间用习惯了ddd,虽然刚开始感觉insight更好用,我还是选择ddd,因为在我调试的程序中有太多的变量需要强制类型转换之后才可以看到真实结果,这样insight就体现不出其优势来了,而ddd和命令行感觉更密切,用起来就得心应手地多。

使用ddd调试程序,在执行之前首先要设置断点,然后按F2运行到断点。按F5是逐步执行,遇到函数则进入函数体内执行(也可用快捷键s);F6用于逐条语句执行,遇到函数直接执行该函数,不进入函数体内(也可用快捷键n);F9是运行到下个断点处(和快捷键c相同功能);F4是结束程序;设置断点和清除断点直接用可视化的操作来完成即可。

对于运行过程中出现错误的程序,一般为了好确定具体在哪个地方出现了内存冲突之类的错误,要现用ddd打开要执行的程序,不设置断点,直接按F2执行,看具体在哪里停下来,根据程序停止的位置,就可以大体确定出错的位置了,然后设置断点,进一步观察,以确定具体错误。当然为了快速确定在处理哪个数据时出错了,最好伴随着输出,以可视化结果。

在从文件中读取数据进行处理的过程中,我通常在处理一个数据之前先打印出数据的序号,然后进入该数据的处理系统。在不设置断点的情况下执行一次,然后在主函数中设置可以识别此次错误将要发生的语句,如在处理第174个数据的时候出现了错误,则在主函数的循环中添加语句:

  1. if(i==174)
  2. {
  3.     break=1;
  4. }
然后对程序重新编译,用ddd打开,设置断点到扇面的第3行,按F2执行到该断点处,然后按F5进入子函数,找到相应位置,再设置断点,按F9执行... ...,在此期间需要不断查看你想知道的内容,调试程序要有目的性,带着问题去查看相应内容,切忌盲目!

在程序输出中带有适当的输出,可以事半功倍,在上面的第3行后面加一条语句,用于输出数据的结构,将可视化此时的数据结构,即可确定错误是不是以前发生的,或者只在本条语句才出现错误。虽然些输出结构的函数有点难,或者很难,但是在大程序中,写一个好的输出函数往往可以“磨刀不误砍柴工”,不要怕麻烦。


登录 *


loading captcha image...
(输入验证码)
or Ctrl+Enter