Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1063347
  • 博文数量: 284
  • 博客积分: 8223
  • 博客等级: 中将
  • 技术积分: 3188
  • 用 户 组: 普通用户
  • 注册时间: 2008-12-01 13:26
文章分类

全部博文(284)

文章存档

2012年(18)

2011年(33)

2010年(83)

2009年(147)

2008年(3)

分类: C/C++

2010-07-08 13:30:51

调试下面这段代码的时候发现异常:
 

0 int HSProcQryrecord(){
1 HQueryrecordAsDin();
2 //for(j=0;j
3 //}

4 }
5 int HQueryrecordAsDin(){
6 int i;
7 i = 1;
8 }

调试环境:

   使用windows上sourceinsight编辑程序,然后ftp到服务器上,使用gcc编译,最后使用gdb进行调试。

调试过程:
  使用gdb调试,跟踪进入HQueryrecordAsDin函数时,gdb显示停在第8行上。这个显示让人很诧异,因为函数还没有执行,怎么就已经跳过了第一个语句呢?此时,如果使用next单步执行,则程序显示第9行。通过打印i的测值,我发现,执行next前,程序虽然显示的是第8行,但实际上语句还未执行,说明gdb显示的语句行不正确。

  怪异的是,如果把上面已经注释掉的for语句部分删除,则gdb工作恢复正常。一个已经被注释的语句怎么会影响调试器的运行呢?

   在几次尝试以后,确认只要把for语句最后的几个看不到的字符删除,则程序调试正常。检查该字符,该字符为ascii“0D”。直接在unix机器上使用vi查看代码,发现该语句在unix上实际显示为:

//for(j=0;j

//}

    估计是该字符在编译器和调试器内的意义不同,导致gdb下调试环境内行号的混乱。

   
     最后结论是,一切错误都是有原因的。
阅读(1002) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~