确定 System.AccessViolationException 的原因。

7
我们遇到了非确定性的System.AccessViolationException异常,这个异常是从本地代码中抛出的。很难重现它,但有时会发生。我不确定是否可以“仅调试它”,因为访问冲突所需的时间约为2小时,并且不能保证访问冲突一定会发生。
本地库由托管包装器使用。它通过JNI从Java中使用,并通过IKVM'ed JNI从.NET中使用。问题只在IKVM'ed代码中复现,但数据集不同,无法使用IKVM'ed应用程序使用的数据测试Java应用程序。
我拥有所有源代码,但(如果可能的话)我希望避免进行大量更改。
我相信本地调用堆栈将提供关于此访问冲突原因的足够信息。
有没有有效的方法来确定此访问冲突的原因?
我认为对我来说理想的解决方案是对代码或进程环境进行一些更改,以便在出现此访问冲突的情况下崩溃并生成内存转储,这样我就可以进行那些更改并等待结果。
1个回答

2

如果您可以等待异常发生,请附加托管和本地调试器(混合调试会话),并将托管调试器设置为在抛出AccessViolationException时中断。当托管调试器检测到未处理的异常时,它会中断进程,然后您应该能够看到本机调用堆栈。


嗯..我修改了我的本地代码,所以肯定会出现访问冲突,并使用调试符号重新编译它。当我正常启动进程并附加Visual Studio调试器时,我为AccessViolationException的抛出添加了一个断点,但它没有被捕获。有什么建议吗? - okutane
1
好的,我发现断点应该是Win32访问冲突。 - okutane

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接