none
求教,偶发数据写入SqlCe4时软件崩溃 RRS feed

  • 问题

  • 状况描述:自己给自己公司开发的软件,运行一段时间后,就会自动关闭掉,大概1天1次,时间不定

    软件功能:读取串口设备的数据,然后写入SqlCe4,另外还有一个软件,会把SqlCe4的数据上传到主服务器(30/次),用微软企业库5连接SqlCe4的

    根据作业的流程,估计是在把数据写入SqlCe4时,发生错误后软件崩溃了

    这套软件在另外3台Pc上没有发生这样的问题,唯独有1台发生,现在换过Pc后,还是发生了,无法理解这个原因时什么,特来求教

    软件的日志功能在这里没办法抓住这个错误,所以只能提供Windows的日志了:

    Event 1026,.NET Runtime
    General
    Application:Scan.exe
    Framework Version:v4.0.30319
    Description:The process was terminated due to an unhanded exception.
    Exception Info:System.AccessViolationException
    Stack:
     at System.Data.SqlServerCe.NativeMethodsHelper.SafeRelease(IntPtr ByRef)
     at System.Data.SqlServerCe.NativeMethods.SafeRelease(IntPtr ByRef)
     at System.Data.SqlServerCe.SqlCeCommand.ReleaseNativeInterface()
     at System.Data.SqlServerCe.SqlCeCommand.Dispose(Boolean)
     at System.Data.SqlServerCe.SqlCeCommand.Finalize()


    Event 1000,Application Error
    General
    Faulting application name:Scan.exe,version:1.1.0.3,time stamp:0x5181c582
    Faulting module name:KERNEL32.dll,version:6.1.7601.17651,time stamp:0x4e211318
    Exception code:0x0000005
    Fault offset:0x000113c8
    Faulting process id:0xd58
    Faulting application path:C:\Program File(x86)\Scan\Scan.exe
    Faulting module path:C:\Windows\syswow64\KERNEL32.dll
    Report Id:500a83de-b3b4-11e2-bd45-90b11c8bebce


    2013年5月3日 17:31

答案

  • 抱歉一直没有回复。

    我搜索了一下,也并没有找到这个抛出异常的其他可能性。由于其他的机器上都不存在这个问题,也不能确定是软件本身有问题。SerialPort是System.IO的,根据MSDN文档来看,.NET里的这些组件正常情况下应该不会抛出这个异常。你说过换过一台PC后还会出现这个问题,感觉应该也不会是硬件问题了吧。

    根据错误信息来看,这个异常出现在Finalize里。有一个想法,这有没有可能是多线程造成的?SQL Server CE的对象并不是线程安全的,如果一个connection被多个线程使用,有可能会出现一些问题。或者说是SQL Server CE的版本有区别。


    Chester Hong
    MSDN Community Support | Feedback to us
    Develop and promote your apps in Windows Store
    Please remember to mark the replies as answers if they help and unmark them if they provide no help.

    • 已标记为答案 Lachesis.L 2013年5月29日 3:13
    2013年5月14日 17:02
    版主

全部回复

  • 你好,

    请问你的软件中有没有使用到非托管的代码或者是unsafe的代码呢?从文档描述来看,AccessViolationException异常通常是因为指针拥有错误的值造成的。

    http://msdn.microsoft.com/zh-cn/library/system.accessviolationexception.aspx

    另外,.NET 4.0中,AccessViolationException是不能被通常的try..catch语句捕获到的。你需要在config文件中添加legacyCorruptedState­­ExceptionsPolicy=true,或者使用HandleProcessCorruptedStateExceptions attribute。

    http://msdn.microsoft.com/en-us/magazine/dd419661.aspx


    Chester Hong
    MSDN Community Support | Feedback to us
    Develop and promote your apps in Windows Store
    Please remember to mark the replies as answers if they help and unmark them if they provide no help.

    2013年5月7日 7:16
    版主
  • 你好,谢谢你的回复。

    1.我的软件完全用C#写的,没有有意识的使用到非托管代码,所有的模块都是。

    2.unsafa的代码也没有。

    3.软件中没有直接对内存操作的。

    4.唯一用到的api是user32.dll,用了SendMessage和ReleaseCapture

    我的疑惑是这样的:

    1.假设我的软件没有问题(因为我没有试图直接修改内存),是否有可能引发这个错误?(因为考虑其他Pc并没有发生这样的问题)

    2.我的软件是需要读取串口扫描枪的,用的是serialport,是否这个控件有可能引起这个错误?

    3.从错误信息来看,System.Data.SqlServerCe 被提及,是否有可能是System.Data.SqlServerCe.4.0的问题?

    4.其他的可能:比如硬盘坏道、内存不兼容、主板电压不稳,这些是否有可能引发这样的错误?

    5.另外,还曾经发生这样的问题:在一段循环中,需要写入17条数据(这17条数据没问题),但是在写入第4条数据后(通过事后查看数据库得知),软件直接崩溃了,这个是否可以解释呢(这个问题发生的让我无法想象)

    说了一堆问题,也算是发发牢骚吧,希望不要见怪,也希望您能提供帮助。


    2013年5月7日 16:19
  • 过了1个多星期,我有这样的想法:

    1.AccessViolationException应不应该被catch?假如我捕捉这个Exception并刻意忽略,是否有潜在的问题?对于一个内存指针错误,这个影响我很难预计

    2.假如AccessViolationException不应该被catch,那发生这个错误的源头是什么呢(这个就回到我发的牢骚上去了)?我必然不想再看到这个error了

    现在,我的对策是第1种方法,看看实际测试的情况吧,时间可能要很久......

    2013年5月13日 10:14
  • 抱歉一直没有回复。

    我搜索了一下,也并没有找到这个抛出异常的其他可能性。由于其他的机器上都不存在这个问题,也不能确定是软件本身有问题。SerialPort是System.IO的,根据MSDN文档来看,.NET里的这些组件正常情况下应该不会抛出这个异常。你说过换过一台PC后还会出现这个问题,感觉应该也不会是硬件问题了吧。

    根据错误信息来看,这个异常出现在Finalize里。有一个想法,这有没有可能是多线程造成的?SQL Server CE的对象并不是线程安全的,如果一个connection被多个线程使用,有可能会出现一些问题。或者说是SQL Server CE的版本有区别。


    Chester Hong
    MSDN Community Support | Feedback to us
    Develop and promote your apps in Windows Store
    Please remember to mark the replies as answers if they help and unmark them if they provide no help.

    • 已标记为答案 Lachesis.L 2013年5月29日 3:13
    2013年5月14日 17:02
    版主
  • 抱歉,我晚来了。

    你提到的多线程的问题,我想可能性也有。

    假设调用了同一个connection,而这时上一次的SqlCeCommand的还没有Finalize,再次调用SqlCeCommand的时候就发生一些问题。听起来感觉更像是ce或SqlCeCommand的问题,再观察吧。

    谢谢

    2013年5月25日 13:13