一套新的软件系统,会或多或少遇到各种bug,有逻辑bug,有笔误bug,有硬件不兼容bug,有本身无法解决的bug。

 

回忆之前解决的几个bug做总结,都是旷日持久的战争:

1,关于exe打不开报错的,bug,首先有的电脑主板可以打开exe,有的就打不开,而且之前4代和2代 3代主板都没问题,

升级到6代7代8代后特别容易出现这个bug,思路, c#判断,c++判断,结论是 set。exe纯mfc的可以打开。而纯c#端也可以打开,

c#调用c++后报错,ntdll。dll报错, 问题 APPCRASH 故障模块名称: ntdll.dll,有时候是其他dll报错(stackhash_56f5  DEX等)。

通常找bug的方法如下: 

主要四点:

一.码畜:靠编译器帮自己查语法错误

二.码农:靠调试器帮自己查逻辑错误

三.码人:靠写日志帮自己查运营错误

四.码神:靠冥想和顿悟帮自己查不可再现错误

其中,通过 码畜方法 定位到一个核心dll 出的问题,但是c#调c++根本进不去。

通过码农方法,跟进 不是逻辑问题,因为其他硬件是没问题的,任务管理器、VMMap、Process Monitor、Process Explorer、GDI泄露检测工具,基本都测试过,没法定位到问题点。其他依赖第三方dll也发现没问题。通过日志和系统日志查找问题,发现ntdll等问题,但是只能查到是内存发生了溢出,冲突不确定是哪里出现的。 不过系统日志是一个很好的方法,能解决一些问题的一个很有效的方法。不过前前后后浪费了很多时间,中间出过一个误区,显示不过来,导致片面认为是directx问题,通过dxdiag。

bugreport 怎么抓log bugreport.exe_c#

基本看来右下角这个地方,都是64位或32位,版本是dxdiag 10.00.但是之前的主板基本是6.0.7.0.8.09.0等版本。这个误区导致,花了大量时间去更换 打补丁这个dxdiag。但是都去升级后也没解决这个问题。

最终利用码神方法,自己去想可能的问题点,最终把问题解决,出在IO卡上面,因为:


 1,CreateFile

  这个函数的功能是创建或者打开一个文件或者I/O设备,通常使用的I/O形式有文件、文件流、目录、物理磁盘、卷、终端流等。如执行成功,则返回文件句柄。 INVALID_HANDLE_VALUE 表示出错,会设置 GetLastError 。 

bugreport 怎么抓log bugreport.exe_c++_02

bugreport 怎么抓log bugreport.exe_c++_03

根本原因就在于,handle 和buffer是我们申请个一个内存空间内的句柄,如果本身我们硬件的使用了这个内存,而我们程序里面引用的第三方库,尤其是io卡会create这个空间,故可能不同主板会引起冲突,彻底删除改win32 io卡后问题解决。

2,长时间运行 程序卡顿,超时,无响应,挂,bug。 此问题出现在 多线程处理中,长时间观察后发现,程序内存没有增长,但是虚拟内存增长迅猛,表现为提交大小一直增长,但是增长不多,因为程序改动较大,通过不用多线程和使用多线程,不用deepl和使用deepl不同分析总结发现,是多线程问题,多线程问题,无非几个地方,1,多线程中内存共用,把所有可能使用有风险的地方全部加锁,2,线程通讯中还出现丢失结果问题,和deepl通讯是使用的socket进程通讯,分析发现,之前只有一个线程,串行计算,后来改为并行多线程,一个socket可能出现,同时发送导致同时收到两个信号,截取的时候给了一个,导致丢失,更改方法是 改为多个port通讯,3,还有个问题是时间不稳定,本地放图加载时间过慢,改为内存加载共享的方法,时间变稳定。4,还有个bug是 每次开线程的句柄使用完后,没有释放,导致每次申请后提交内存不断上升。至此 全部bug解决。

3,莫名奇妙的程序出现白屏,很多控件显示不全,刷新问题,甚至有时候出现程序莫名其妙的崩溃,因为程序是c#的,仔细发现,当我刷新很多界面的时候尤其容易出现,出现了3站 6图的必发问题bug,开始通过减少整个程序的内存分配和刷新的冻结,

可以起到缓解的作用,但是当我c#的控件增多和刷新多站照片,尤其每次15m的彩色图多站还是治标不治本,当仔细重新整理思路,发现我的程序是32位,提交内存大于1G后极易出现问题,故锁定查资料,发现32位程序占用内存有限制,当exe改为大地址后问题得到解决。

4,还有个bug 困扰我很久,当程序的模组出现过多时候,打开程序变慢,甚至直接挂掉,因为我每次new二级界面是在c++的界面打开的,即mfc产生的不同各个子界面贴到了一个teach框上,而当模组过多,尤其mfc的窗体很多控件的时候,你会发现,GDI对象太多,当到9000+的时候就会挂掉,这个试过很多方法都是无解,只能绕道前行,正好打开这么多个gdi对象界面很卡很慢,通过new all 用的模组的方法,可以实现只产生一次,每次模组更新数据即可。

5,之前还有个bug困扰很久,就是ghost的系统 解码软件有时候出现解码一样的情况,发现是序列号读取有误,通过更新解码方式后解决。

6,还有个问题是经常出现ghost或者新装系统,程序打不开,经过一次次跟踪,发现io卡驱动ghost没成功,或者未安装正确导致!

 

   总结 ,思路决定出路,很多情况下 是不断转变思路,才能 柳暗花明又一村!