VC编程之关于VC 6.0的new调用在debug模式下的bug
小标 2019-05-07 来源 : 阅读 1670 评论 0

摘要:本文主要向大家介绍了VC编程之关于VC 6.0的new调用在debug模式下的bug,通过具体的内容向大家展示,希望对大家学习VC编程有所帮助。

本文主要向大家介绍了VC编程之关于VC 6.0的new调用在debug模式下的bug,通过具体的内容向大家展示,希望对大家学习VC编程有所帮助。

VC编程之关于VC 6.0的new调用在debug模式下的bug

    维护的项目是用VC6.0开发的,安装到现场运行发现每个月都要崩溃一次,经过检查dmp文件发现是由VC6.0的crt库中new操作所对应的代码引起Microsoft visual Studio/VC98/Crt/Src/dbgheap.c),这个文件中_heap_alloc_dbg()函数用到一个long型的变量用来计数,一旦该计数器到达long型的最大值就会引发int 3中断《VC++6.0之new调用的bug》:

/* break into debugger at specific memory allocation */         if (lRequest == _crtBreakAlloc)             _CrtDbgBreak();

    这个问题其实很容易解决,经查询vs2003已经修改为这样,已经消除了这个bug:

/* break into debugger at specific memory allocation */         if (_crtBreakAlloc != -1L && lRequest == _crtBreakAlloc)             _CrtDbgBreak();

    从逻辑上消除这个bug很容易,但问题是这个是MFC的库,到网上查询解决办法,有以下几种方案:

    1、用UE打开msvcrtd.dll,使用16进制编辑模式,查找得到的二进制指令,发现确实只有二处,把紧接着它们的0xCC替换为0x90,问题解决

    2、修改debug report模式,即用_CrtSetReportMode和_CrtSetReportFile将_CrtDbgBreak弹出的对话框屏蔽掉,代码如下:

_CrtSetReportMode( _CRT_ASSERT, _CRTDBG_MODE_FILE ); _CrtSetReportFile( _CRT_ASSERT, _CRTDBG_FILE_STDOUT ); _CrtSetReportMode( _CRT_ERROR, _CRTDBG_MODE_FILE ); _CrtSetReportFile( _CRT_ERROR, _CRTDBG_FILE_STDOUT ); _CrtSetReportMode( _CRT_WARN, _CRTDBG_MODE_FILE ); _CrtSetReportFile( _CRT_WARN, _CRTDBG_FILE_STDOUT );

    3、改用内存池之类的技术,减少new的使用

    4、将项目改为VS2003以上的IDE去编译

    首先试着用UE编辑这个dll,发现自己这方面知识太欠缺不知道如何改,问了身边几个人也没明白的,而且这个方案屏蔽了_CrtDbgBreak的功能也可能带来其他问题,只能放弃。

    满心欢喜的尝试第二种方案,却发现根本屏蔽不了,该弹出照样弹出,貌似只能截获一部分,但具体为什么不能生效也没搞懂。

    紧接着尝试了用内存池方式来减少new的使用,使用了boost提供的内存池试了一下还蛮容易上手使用的,不过缺点是这种方法治标不治本,MFC自己还有大量的new操作。

    比较无奈的尝试了一下用VS2008编译这套代码,竟然产生了上千条错误,很费劲的改了一天,能编译出EXE了。拿到运行环境一运行竟然崩溃……

--------------------------------------------------------------------------

    幸好最后找到了解决办法,那就是本文要隆重介绍的终极解决方案

    之前一直认为dbgheap.c文件是mfc一部分,不能改写!偶然发现了其实MFC提供了重编译它的makefile文件,请参考《重新编译生成C运行时库》。

    首先把dbgheap.c文件中bug修改过来,然后按照这篇文章介绍的方法重编译C运行时库,就一切OK啦!

    需要注意的是msvcrtd.dll我没有生成出来,编译到这里发生错误停止了,但libcmt.lib可以编译出来,最后我的项目只能使用静态链接方式使用MFC库。

以上就介绍了VC/MFC的学习,希望对VC/MFC有兴趣的朋友有所帮助。了解更多内容,请关注职坐标编程语言VC/MFC频道!

本文由 @小标 发布于职坐标。未经许可,禁止转载。
喜欢 | 0 不喜欢 | 0
看完这篇文章有何感觉?已经有0人表态,0%的人喜欢 快给朋友分享吧~
评论(0)
后参与评论

您输入的评论内容中包含违禁敏感词

我知道了

助您圆梦职场 匹配合适岗位
验证码手机号,获得海同独家IT培训资料
选择就业方向:
人工智能物联网
大数据开发/分析
人工智能Python
Java全栈开发
WEB前端+H5

请输入正确的手机号码

请输入正确的验证码

获取验证码

您今天的短信下发次数太多了,明天再试试吧!

提交

我们会在第一时间安排职业规划师联系您!

您也可以联系我们的职业规划师咨询:

小职老师的微信号:z_zhizuobiao
小职老师的微信号:z_zhizuobiao

版权所有 职坐标-一站式IT培训就业服务领导者 沪ICP备13042190号-4
上海海同信息科技有限公司 Copyright ©2015 www.zhizuobiao.com,All Rights Reserved.
 沪公网安备 31011502005948号    

©2015 www.zhizuobiao.com All Rights Reserved

208小时内训课程