C#多次调用DLL结果不一致

.Net技术 码拜 9年前 (2015-05-10) 1433次浏览 0个评论

用周立功的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分
引用 楼主 hit_wxh 的回复:

用周立功的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时,出现结果不一致的原因一般有哪些,除了单步运行还有什么办法可以查
非常感谢!

加log,记录下每次调用的相关参数,拿这些参数进行调试,看复现么?

10分
遇到困难而临时磨枪,谁也没有什么简单的解决办法。

只能是“把随机变为必然”,你能找到以任何方法序列、到任何人的机器、使得10次中至少有7次能够重现问题,这时候才能开始解决问题。否则你要做的就是把“随机变成必然”的这种初级的工作,它很重要而且经常是浪费大量时间,但是不这样办就不能发现问题。

所以好的产品都把以前的几百个深度的问题写成了自动化测试用例,使得以后可以随时拿出来对产品进行质量控制之用。而如果一个产品是小作坊做的,那么就更容易遇到翻车、令人想放弃的bug。

引用 楼主 hit_wxh 的回复:

单步过的时候是OK的,想请问调用一个DLL时,出现结果不一致的原因一般有哪些,除了单步运行还有什么办法可以查
非常感谢!

测试的思路跟随便尝试使用是不一样的。设计测试用例需要有“想象力”,例如一个人只有想到了要在3秒钟内保证模拟10个人非常平均而准确地并发操作,他才能发现一些深度问题。所以好的测试人员是非常好的产品经理的人选,就是这不是一般的人可以随便糊弄一下领导、随便“点点点”地简单地所谓单步就行了。

带着目的、故意要把压力作用到系统中(可能的)某个机制上,这样的人才能发现系统70%的问题。而随随便便胡乱“单步运行”的人,往往只能发现10%的问题,然后就再也懒得去测试了。

有什么办法可以查?

其实就是用心去设计测试用例,设计不同角度的测试用例,保证并发多线程模拟测试,保证每天至少运行1000遍测试,保证在开发中一旦修改一些代码就进行回归测试。这些做到了,就算是一个比较合格的“查结果不一致”的成熟的程序员了。

引用 1 楼 liucqa 的回复:

你可以在代码里面延时1秒重试。

我试了一下只要有延时,甚至10ms都可以不再返回失败,所以考虑是连续对设备操作的时候设备反应不过来,然后用楼下的办法用getlasterror输出日志,出错的时候提示为997,重叠 I/O  操作在进行中,这是否说明确实是需要等待设备呢?

引用 2 楼 lichjx 的回复:

弄个Log4net什么的写日志,把运行状况记下来,然后分析程序运行出问题时的环境上下文,如果多线程,共享资源加个锁,测一下还有没有问题,出问题时记录下线程号或端口资源使用状况,看是不是并发引起的。

非常感谢!新技能GET
整个程序里面除了两个定时器以外没有别的子线程了,而两个定时器都是在这里成功之后才开启,所以我觉得应该不是并发的原因


CodeBye 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明C#多次调用DLL结果不一致
喜欢 (0)
[1034331897@qq.com]
分享 (0)

文章评论已关闭!