如何测试AccessViolationException的处理
我需要编写一个测试来validation我的代码可以处理AccessViolationException(或任何其他WIN32损坏状态exception – CSE),它通常通过调用第三方库来处理不安全的上下文。 这应该都是使用C#on .net 4.0完成的。
我发现了这个相关的问题如何处理AccessViolationException和这篇相关的文章http://dotnetslackers.com/articles/net/All-about-Corrupted-State-Exceptions-in-NET4.aspx ,它解释了如何捕获这些CSE和他们的背景。
所以我想在测试中激发一个WIN32 CSE,以确保在我的应用程序中正确处理。 就像是:
一些要测试的示例类:
public class MyExceptionHandler { [HandleProcessCorruptedStateExceptions] public void HandleCorruptedStateException() { try { //Force genuine unsafe AccessViolationException //not just a throw new AccessViolationException } catch(Exception e) { //Log/cleanup/other } } public void DoesNotHandleCorruptedStateException() { try { //Force genuine unsafe AccessViolationException //not just a throw new AccessViolationException } catch (Exception e) { //Log/cleanup/other } } }
一个测试:
class MyTest { [Test] public void ShouldVerifyThatAnAccessViolationExceptionIsHandledCorrectly() { var handler = new MyExceptionHandler(); Assert.DoesNotThrow(() => handler.HandleCorruptedStateException()); } [Test] public void ShouldVerifyThatAnAccessViolationExceptionIsNotHandledCorrectly() { var handler = new MyExceptionHandler(); Assert.Throws(() => handler.DoesNotHandleCorruptedStateException()); } }
有没有人建议如何在没有太多工作的情况下实现这一目标(例如,编写导致此exception的不安全的lib)。
亲切的问候
更新:为了匹配我的最终解决方案,感谢JaredPar。
public class MyExceptionHandler { [HandleProcessCorruptedStateExceptions] public void HandleCorruptedStateException() { try { var ptr = new IntPtr(42); Marshal.StructureToPtr(42, ptr, true); } catch(Exception e) { //Log/cleanup/other } } public void DoesNotHandleCorruptedStateException() { try { var ptr = new IntPtr(42); Marshal.StructureToPtr(42, ptr, true); } catch (Exception e) { //Log/cleanup/other } } }
提示:要从命令行手动使用简单的控制台应用程序validation此操作:
class Program { static void Main(string[] args) { var handler = new MyExceptionHandler(); if (args.Length > 1) { handler.HandleCorruptedStateException(); } else { handler.DoesNotHandleCorruptedStateException(); } } }
请尝试以下方法
var ptr = new IntPtr(42); Marshal.StructureToPtr(42, ptr, true);
这不能保证通过CLI规范抛出AccessViolationException
,但它会在我所知道的每个平台上抛出
private static unsafe void AccessViolation() { int* p = (int*)0xFF004324; int q = *p; }
编辑出不安全的写作。 从该地址读取仍应生成AccessViolationException,除非巧合地在您的地址空间内。