【问题标题】:How to simulate a corrupt state exception in .NET 4?如何在 .NET 4 中模拟损坏状态异常?
【发布时间】:2011-02-26 08:47:51
【问题描述】:

嗯,微软在 .NET 4 中添加了 HandleProcessCorruptedStateExceptions 属性:

HandleProcessCorruptedStateExceptionsAttribute Class

我想测试这个功能。如何使我的应用程序进入“损坏状态”?

【问题讨论】:

  • 假设你抓住了它。你打算用它做什么?
  • 记录下来。我们有一个没有任何日志的生产崩溃。这个新日志将对我们有所帮助。

标签: .net state simulation corrupt


【解决方案1】:

搞砸垃圾收集堆总是一个好办法:

using System;
using System.Runtime.InteropServices;


class Program {
  unsafe static void Main(string[] args) {
    var obj = new byte[1];
    var pin = GCHandle.Alloc(obj, GCHandleType.Pinned);
    byte* p = (byte*)pin.AddrOfPinnedObject();
    for (int ix = 0; ix < 256; ++ix) *p-- = 0;
    GC.Collect();   // kaboom
  }
}

【讨论】:

    【解决方案2】:

    只需取消引用一个随机数:

        private static unsafe void AccessViolation()
        {
            byte b = *(byte*) (8762765876);
        }
    

    或溢出堆栈:

        private static void StackOverflow()
        {
            StackOverflow();
        }
    

    【讨论】:

    【解决方案3】:

    测试HandleProcessCorruptedStateExceptions 功能:

    using System.Diagnostics;
    using System.Runtime.ExceptionServices;
    using System.Runtime.InteropServices;
    ...
    
    [HandleProcessCorruptedStateExceptions]
    public void HandleCorruptedStateException()
    {
        try
        {
            var ptr = new IntPtr(42);
            Marshal.StructureToPtr(42, ptr, true);
        }
        catch(Exception ex)
        {
             Debug.WriteLine(ex.Message);
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2023-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-02-18
      • 2012-02-16
      • 2019-08-31
      相关资源
      最近更新 更多