用周立功的USBCAN库做二次开发,调用dll中的一个函数(Do_VCI_StartCAN(),见下)时,在我电脑上用几次会随机的出现一两次不成功,换一台电脑就没有这种情况。 private void Window_Loaded(object sender, RoutedEventArgs e) { VCI_Return_Status re = 0; try { re = this.vm_binding.vm_caninstance.Do_VCI_OpenDevice(); if (re == VCI_Return_Status.STATUS_OK) { this.lbl_status.Content = "打开设备成功"; re = this.vm_binding.vm_caninstance.Do_VCI_StartCAN();//就是这里 if (re == VCI_Return_Status.STATUS_OK) { this.lbl_status.Content = "开始接收CAN数据..."; this.vm_binding.vm_timer.Start(); this.DataSaveTimer.Start(); } else { this.lbl_status.Content = "开始接收数据失败。请检查设备连接是否正确,然后重新启动程序。"; this.vm_binding.vm_timer.Stop(); this.DataSaveTimer.Stop(); } } else { this.lbl_status.Content = "打开设备失败,请检查设备是否正确连接PC,是否正确安装设备驱动"; } } catch (Exception excp) { StringBuilder sb = new StringBuilder(); sb.Append("打开设备异常:").Append(excp.Message); // this.lbl_status.Content = sb.ToString(); } } 单步过的时候是OK的,想请问调用一个DLL时,出现结果不一致的原因一般有哪些,除了单步运行还有什么办法可以查 |
|
15分 |
你可以在代码里面延时1秒重试。
|
10分 |
弄个Log4net什么的写日志,把运行状况记下来,然后分析程序运行出问题时的环境上下文,如果多线程,共享资源加个锁,测一下还有没有问题,出问题时记录下线程号或端口资源使用状况,看是不是并发引起的。
|
5分 |
加log,记录下每次调用的相关参数,拿这些参数进行调试,看复现么? |
10分 |
遇到困难而临时磨枪,谁也没有什么简单的解决办法。
只能是“把随机变为必然”,你能找到以任何方法序列、到任何人的机器、使得10次中至少有7次能够重现问题,这时候才能开始解决问题。否则你要做的就是把“随机变成必然”的这种初级的工作,它很重要而且经常是浪费大量时间,但是不这样办就不能发现问题。 所以好的产品都把以前的几百个深度的问题写成了自动化测试用例,使得以后可以随时拿出来对产品进行质量控制之用。而如果一个产品是小作坊做的,那么就更容易遇到翻车、令人想放弃的bug。 |
测试的思路跟随便尝试使用是不一样的。设计测试用例需要有“想象力”,例如一个人只有想到了要在3秒钟内保证模拟10个人非常平均而准确地并发操作,他才能发现一些深度问题。所以好的测试人员是非常好的产品经理的人选,就是这不是一般的人可以随便糊弄一下领导、随便“点点点”地简单地所谓单步就行了。 带着目的、故意要把压力作用到系统中(可能的)某个机制上,这样的人才能发现系统70%的问题。而随随便便胡乱“单步运行”的人,往往只能发现10%的问题,然后就再也懒得去测试了。 |
|
有什么办法可以查?
其实就是用心去设计测试用例,设计不同角度的测试用例,保证并发多线程模拟测试,保证每天至少运行1000遍测试,保证在开发中一旦修改一些代码就进行回归测试。这些做到了,就算是一个比较合格的“查结果不一致”的成熟的程序员了。 |
|
我试了一下只要有延时,甚至10ms都可以不再返回失败,所以考虑是连续对设备操作的时候设备反应不过来,然后用楼下的办法用getlasterror输出日志,出错的时候提示为997,重叠 I/O 操作在进行中,这是否说明确实是需要等待设备呢? |
|
非常感谢!新技能GET |