积极答复者
求教,偶发数据写入SqlCe4时软件崩溃

问题
-
状况描述:自己给自己公司开发的软件,运行一段时间后,就会自动关闭掉,大概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- 已编辑 Lachesis.L 2013年5月3日 17:32
- 已移动 ThankfulHeart 2013年5月4日 11:24 数据交互问题
答案
-
抱歉一直没有回复。
我搜索了一下,也并没有找到这个抛出异常的其他可能性。由于其他的机器上都不存在这个问题,也不能确定是软件本身有问题。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
全部回复
-
你好,
请问你的软件中有没有使用到非托管的代码或者是unsafe的代码呢?从文档描述来看,AccessViolationException异常通常是因为指针拥有错误的值造成的。
http://msdn.microsoft.com/zh-cn/library/system.accessviolationexception.aspx
另外,.NET 4.0中,AccessViolationException是不能被通常的try..catch语句捕获到的。你需要在config文件中添加legacyCorruptedStateExceptionsPolicy=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. -
你好,谢谢你的回复。
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条数据后(通过事后查看数据库得知),软件直接崩溃了,这个是否可以解释呢(这个问题发生的让我无法想象)
说了一堆问题,也算是发发牢骚吧,希望不要见怪,也希望您能提供帮助。
- 已编辑 Lachesis.L 2013年5月7日 17:01
-
抱歉一直没有回复。
我搜索了一下,也并没有找到这个抛出异常的其他可能性。由于其他的机器上都不存在这个问题,也不能确定是软件本身有问题。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