用周立功的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时,出现结果不一致的原因一般有哪些,除了单步运行还有什么办法可以查
非常感谢!
------解决思路----------------------
你可以在代码里面延时1秒重试。
------解决思路----------------------
弄个Log4net什么的写日志,把运行状况记下来,然后分析程序运行出问题时的环境上下文,如果多线程,共享资源加个锁,测一下还有没有问题,出问题时记录下线程号或端口资源使用状况,看是不是并发引起的。
------解决思路----------------------
加log,记录下每次调用的相关参数,拿这些参数进行调试,看复现么?
------解决思路----------------------
遇到困难而临时磨枪,谁也没有什么简单的解决办法。
只能是“把随机变为必然”,你能找到以任何方法序列、到任何人的机器、使得10次中至少有7次能够重现问题,这时候才能开始解决问题。否则你要做的就是把“随机变成必然”的这种初级的工作,它很重要而且经常是浪费大量时间,但是不这样办就不能发现问题。
所以好的产品都把以前的几百个深度的问题写成了自动化测试用例,使得以后可以随时拿出来对产品进行质量控制之用。而如果一个产品是小作坊做的,那么就更容易遇到翻车、令人想放弃的bug。