遭遇应用程序正常初始化失败

时间:2021-10-19 19:49:39

案例一:
2009.11月某日的案例 StereoCamera项目
(某个全局对象初始化的时候,memset越界导致堆错误导致的)
 很奇怪的问题。 周五临下班时,发StereoCamera.dll的版本。

从vss上down下最新的代码,编译,连接,运行,!!!应用程序正常初始化失败! faint!换了放到pc目录下,也是失败。

单步调试吧,还没进入main()函数之前就提示 应用程序正常初始化失败! 看来原因应该出现在进入main函数之前的代码,也就是在执行某些全局变量构造函数的时候,接着查找,发现问题出现在Trace()的构造函数里,因为StereoCamera的构造函数里构造了 Trace对象,而StereoCamera是个全局的静态变量。

接着定位,定位到了 malloc2d函数,但是,从崩溃现场来看,代码的逻辑每一点问题,malloc的内存也不是很大,怎么会失败呢?
出错地方类似于下面的代码 new int[10], new跑出了 bad_alloc 异常。

从逻辑上分析,应该不是内存不足的问题,因为通过任务管理器查看也没有什么问题。
难道是全局变量的初始化里不应该执行太多的new操作?(也就是在进入main之前不能执行太多的malloc操作?)试着把够着函数里面的new Trace代码移到了普通成员函数里,测试,还是不行。

看来这问题比较复杂。无奈代码不是自己写的。哎。

最后找来代码原作者,发现问题,某个memset的时候内存越界,这导致破坏了系统的内存,导致了bad_alloc

案例二:
2009.11月某日的另一个案例。Led_Calibration项目
(没有使用原始版本的sln解决方案文件文件导致)
之前一直在笔记本下,现在使用台式机后,很多代码都需要从vss上down下来。
今日down了最新的 Led_Calibration代码,删除掉sln解决方案,自己建了一个解决方案,然后编译、运行,弹出:应用程序初始化失败!奇怪,之前都好好的程序会失败!
而且vc2005提示 该进程加载的某个dll中存在堆错误,导致加载失败!

郁闷,然后换了小赵电脑,从新down下vss上的代码,这次没有删掉sln,直接使用vss上down下的sln(虽然sln文件你直接双击打不开,但是可以先打开vc2005然后把sln文件拖进来),编译,运行,OK!

我靠,好奇怪的问题哦。 然后回到自己的台式机上,down下vss上的sln文件,编译、运行,我靠,也好了!

你说怪不怪? 而且当初vc2005还像模像样的给我提示某个dll存在对错误。真是莫名其妙。

 

案例三:
重写了tsGUI的部分接口,然后写了一个test控制台测试用例。一直用着好好的,可是突然某一次编译运行就不行了,怪了 tsGUI我也没改啥啊,就算改动也是在正常范围之内啊。
出错提示:
windows 已在 test.exe 中触发一个断点。
其原因可能是堆被破坏,这也说明 test.exe 中或它所加载的任何DLL 中有 Bug。

输出窗口:
test.exe 中的 0x7c92e470 处最可能的异常: 0xC0000005: 读取位置 0x00000130 时发生访问冲突
R6034
An application has made an attempt to load the C runtime library without using a manifest.
This is an unsupported way to load Visual C++ DLLs. You need to modify your application to build with a manifest.
For more information, see the "Visual C++ Libraries as Shared Side-by-Side Assemblies" topic in the product documentation.
Windows 已在 test.exe 中触发一个断点。

其原因可能是堆被损坏,这也说明 test.exe 中或它所加载的任何 DLL 中有 bug。



通过看提示,看崩溃点,好像是manifest的问题,修改项目属性 清单工具 - 常规 - 使用fat32解决方案 重新编译OK。