【原创】wingdb开发过程中遇到一个比较“头疼”的bug
2012-07-12 03:25
375 查看
我自持也写了XX行的代码,调试经验也不可谓不强大笑。但是最近遇到的这个bug,却
着实让我头疼了一会...错!不是一会,是3天啊!
具体是这样的,在开发windows下的gdb GUI调试环境时,使用thread PIPE与gdb mi
接口交互,在winodows 7下编写代码。上周五突然遇到一个问题:就是程序运行着就会突
然崩溃。马上用ollydbg作为系统默认活动调试器,在崩溃后立即调试进程,发现错误点
随机出现在主线程和PIPE READ线程中,而且指令在ntdll中出错。并且看不到调用链,
不能回溯到我的程序中去,这说明不是我的程序直接引发的,而是“间接”引发的问题。
奇怪的事来了,如果我用wingdb调试其他的pe文件不会出错,只有特定的那一个pe
文件必错。比这个pe文件大或小的文件都不错,单单这个pe文件会错。而且只在向gdb
mi发送特定的cmd时才会错,使用其他cmd不会错:
代码:
第一条指令返回的string长度要大于第二条。而且还有更郁闷的事,在debug模式下
运行程序,啥错都没有,怎么都不崩!调试最痛苦的事莫过如此....
由于在windows7下调试安全保护不便的原因所以我尝试在xp下调试,看能不能找
到问题根结。更奇怪的事来了,在双核系统xp下没有出错!而且我原来的windows7
是单核的系统,我原以为可能是多线程同步的问题,这时觉得也不像。
不能就此放过, 不能幻想是系统的bug,不是我的。并且念上10000句fxxk后,回去
肆虐TA发泄!我再一次回到windows7系统上,最小化出错点(就像我不止一次在汇编及
C区说的那样),编写对应的单元测试,增加PRINT DEBUG语句,不是一条两条的加,
而是几十条的加。因为MinGW调试有限,所以换了调试也很有限的Code::Blocks,不过
比MinGW好点。使用VS 20xx的各位可能会暗自窃喜:叫你不用VS IDE。我承认在这个
方面如果我最初用VS开发,也许调试起来就会快很多。也许吧...但我不能也不打算在回
到那个VS IDE中去,原因使用GCC的各位同仁自然懂得...
言归正传,在用最简化的UNIT TEST测试后,发现崩溃出在C库函数free()里。在经
历了N多的反复递进调试中后(就像在魔兽3中从zero开始建基地那样),终于发现根本
问题所在:在N多的malloc和赋值和free中,一个赋值往末尾多赋了一个'\0',就是这一个
byte导致C heap链表被破坏,使得最终在某次的free中(主线程或PIPE Thread)发生崩溃
。然而为什么只有特定的文件,特定的指令才会崩溃,我想这个只能感谢GOD让我遇到
了那个出错的文件,并且出错了。因为这种错误和未初始化的变量一样属于“随机”情况。
细心的朋友可能还不放过,会问:那在XP下为什么不出错?这个很简单,因为win7的
安全性和鲁棒性(如果我让你产生了联想,那么我换一个词:健壮性大笑)比xp要高,
that's why!!!
末了我想再说几句,如果用NT的debug heap和若干wingdb选项的话,我还用这么费
劲吗???呜呜呜...不过没事了,重要的是我会记住"调痛",我可以GO ON了,呵呵。
着实让我头疼了一会...错!不是一会,是3天啊!
具体是这样的,在开发windows下的gdb GUI调试环境时,使用thread PIPE与gdb mi
接口交互,在winodows 7下编写代码。上周五突然遇到一个问题:就是程序运行着就会突
然崩溃。马上用ollydbg作为系统默认活动调试器,在崩溃后立即调试进程,发现错误点
随机出现在主线程和PIPE READ线程中,而且指令在ntdll中出错。并且看不到调用链,
不能回溯到我的程序中去,这说明不是我的程序直接引发的,而是“间接”引发的问题。
奇怪的事来了,如果我用wingdb调试其他的pe文件不会出错,只有特定的那一个pe
文件必错。比这个pe文件大或小的文件都不错,单单这个pe文件会错。而且只在向gdb
mi发送特定的cmd时才会错,使用其他cmd不会错:
代码:
read_str_4a_cmd(&g_npp,"set disassembly-flavor intel\n",buf_tmp,&size,5000); //err! read_str_4a_cmd(&g_npp,"set\n",buf_tmp,&size,5000); //ok!
第一条指令返回的string长度要大于第二条。而且还有更郁闷的事,在debug模式下
运行程序,啥错都没有,怎么都不崩!调试最痛苦的事莫过如此....
由于在windows7下调试安全保护不便的原因所以我尝试在xp下调试,看能不能找
到问题根结。更奇怪的事来了,在双核系统xp下没有出错!而且我原来的windows7
是单核的系统,我原以为可能是多线程同步的问题,这时觉得也不像。
不能就此放过, 不能幻想是系统的bug,不是我的。并且念上10000句fxxk后,回去
肆虐TA发泄!我再一次回到windows7系统上,最小化出错点(就像我不止一次在汇编及
C区说的那样),编写对应的单元测试,增加PRINT DEBUG语句,不是一条两条的加,
而是几十条的加。因为MinGW调试有限,所以换了调试也很有限的Code::Blocks,不过
比MinGW好点。使用VS 20xx的各位可能会暗自窃喜:叫你不用VS IDE。我承认在这个
方面如果我最初用VS开发,也许调试起来就会快很多。也许吧...但我不能也不打算在回
到那个VS IDE中去,原因使用GCC的各位同仁自然懂得...
言归正传,在用最简化的UNIT TEST测试后,发现崩溃出在C库函数free()里。在经
历了N多的反复递进调试中后(就像在魔兽3中从zero开始建基地那样),终于发现根本
问题所在:在N多的malloc和赋值和free中,一个赋值往末尾多赋了一个'\0',就是这一个
byte导致C heap链表被破坏,使得最终在某次的free中(主线程或PIPE Thread)发生崩溃
。然而为什么只有特定的文件,特定的指令才会崩溃,我想这个只能感谢GOD让我遇到
了那个出错的文件,并且出错了。因为这种错误和未初始化的变量一样属于“随机”情况。
细心的朋友可能还不放过,会问:那在XP下为什么不出错?这个很简单,因为win7的
安全性和鲁棒性(如果我让你产生了联想,那么我换一个词:健壮性大笑)比xp要高,
that's why!!!
末了我想再说几句,如果用NT的debug heap和若干wingdb选项的话,我还用这么费
劲吗???呜呜呜...不过没事了,重要的是我会记住"调痛",我可以GO ON了,呵呵。
相关文章推荐
- wingdb开发过程中遇到一个比较“头疼”的bug
- wingdb开发过程中遇到一个比较“头疼”的bug
- wingdb开发过程中遇到一个比较“头疼”的bug
- iOS开发笔记之三十一——日历NSCaledar使用过程中遇到的一个苹果系统bug
- VS 2017开发ASP.NET Core Web应用过程中发现的一个重大Bug
- 解决工作中遇到的一个"打开,保存"文件框的bug的过程
- 使用WebDriver的过程中遇到的一个Bug
- 一直以来我(每个从事linux开发的人)深受“bug”的困扰,好像“bug”不足以描述这种被问题困扰的无奈。因为当在驱动或BSP的开发过程中,所碰到的问题比解决一个bug难得多。 Li
- Android 开发过程中遇到了一个问题 小记录一下 ERROR: In <declare-styleable> BorderLinearLayout, unable to find attribu
- 开发过程碰到的一个bug
- 记录一下开发过程中遇到的一些让人纠结的bug
- 串口通信(MSComm)开发过程记录(包含一个可以通信的比较基础的程序版本)
- 开发过程中遇到的bug以及解决办法 面试回答个人遇到
- MySQL创建过程,遇到一个奇怪的bug
- IOS开发之Bug--遇到一个类型不确定的bug
- 我们在 web 应用开发过程中经常遇到输出某种编码的字符,如 iso8859-1 等,如何输出一个某种编码的字符串?
- C# 开发过程遇到Bug
- 我们在 web 应用开发过程中经常遇到输出某种编码的字 符, 如 iso8859-1 等, 如何输出一个某种编码的字符串?
- 记开发过程中偶遇的一个bug
- 当我们在ASP.NET开发时,经常会遇到一个头疼的问题:字符数的控制