• System.AccessViolationException: 尝试读取或写入受保护的内存。这通常指示其他内存已损坏。


    昨天写的RC4的加解密程序,当C#调用C的dll时就会出现这个提示,尝试怎么修改都不行。Debug跟踪显示,应该返回string类型的函数返回值为空。也不知道怎么调试dll,dll里下的断点始终提示无效。单独运行dll里的函数,结果没有问题。几乎可以断定是函数返回的地方出错了。


      

     

    终于搞清楚错误的真正原因了。诡异的是,这个错误是我趴在桌子上半梦半醒的状态下想到的。更诡异的是,睡醒了之后还记得睡梦中的想法。尝试修改错误,竟然真的就成功了。有点玄......


      

     

    这个错误其实不应该犯,《C专家编程》和《C陷阱与缺陷》里都提到过,自己也做了这条的笔记。只是之前几乎一样的dll调用都做过,也都成功运行得到了正确的结果,就以为dll里不会出什么错,一直在C#的代码里找错。而且同样的错误提示也见过,只是那时是糊里糊涂的把数组赋个初始值就解决了,也就没太在意。



     

    错误提示: 

    有关调用实时(JIT)调试而不是此对话框的详细信息,
    请参见此消息的结尾。

    ************** 异常文本 **************
    System.AccessViolationException: 尝试读取或写入受保护的内存。这通常指示其他内存已损坏。
       在 RC4_GUI.RC4_form.RC4_decrypt(String strings_hex, Int32 start, Int32 length)
       在 RC4_GUI.RC4_form.decrypt_button1_Click(Object sender, EventArgs e) 位置 F:\Crypt\Modern Cryptology\GUI\RC4_GUI\Form1.cs:行号 136
       在 System.Windows.Forms.Control.OnClick(EventArgs e)
       在 System.Windows.Forms.Button.OnClick(EventArgs e)
       在 System.Windows.Forms.Button.OnMouseUp(MouseEventArgs mevent)
       在 System.Windows.Forms.Control.WmMouseUp(Message& m, MouseButtons button, Int32 clicks)
       在 System.Windows.Forms.Control.WndProc(Message& m)
       在 System.Windows.Forms.ButtonBase.WndProc(Message& m)
       在 System.Windows.Forms.Button.WndProc(Message& m)
       在 System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m)
       在 System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m)
       在 System.Windows.Forms.NativeWindow.Callback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)


    ************** 已加载的程序集 **************
    mscorlib
        程序集版本: 2.0.0.0
        Win32 版本: 2.0.50727.4927 (NetFXspW7.050727-4900)
        基本代码: file:///C:/Windows/Microsoft.NET/Framework/v2.0.50727/mscorlib.dll
    ----------------------------------------
    RC4_GUI
        程序集版本: 1.0.0.0
        Win32 版本: 1.0.0.0
        基本代码: file:///F:/Crypt/Modern%20Cryptology/GUI/RC4_GUI/bin/Debug/RC4_GUI.exe
    ----------------------------------------
    System.Windows.Forms
        程序集版本: 2.0.0.0
        Win32 版本: 2.0.50727.4927 (NetFXspW7.050727-4900)
        基本代码: file:///C:/windows/assembly/GAC_MSIL/System.Windows.Forms/2.0.0.0__b77a5c561934e089/System.Windows.Forms.dll
    ----------------------------------------
    System
        程序集版本: 2.0.0.0
        Win32 版本: 2.0.50727.4927 (NetFXspW7.050727-4900)
        基本代码: file:///C:/windows/assembly/GAC_MSIL/System/2.0.0.0__b77a5c561934e089/System.dll
    ----------------------------------------
    System.Drawing
        程序集版本: 2.0.0.0
        Win32 版本: 2.0.50727.4927 (NetFXspW7.050727-4900)
        基本代码: file:///C:/windows/assembly/GAC_MSIL/System.Drawing/2.0.0.0__b03f5f7f11d50a3a/System.Drawing.dll
    ----------------------------------------
    System.Configuration
        程序集版本: 2.0.0.0
        Win32 版本: 2.0.50727.4927 (NetFXspW7.050727-4900)
        基本代码: file:///C:/windows/assembly/GAC_MSIL/System.Configuration/2.0.0.0__b03f5f7f11d50a3a/System.Configuration.dll
    ----------------------------------------
    System.Xml
        程序集版本: 2.0.0.0
        Win32 版本: 2.0.50727.4927 (NetFXspW7.050727-4900)
        基本代码: file:///C:/windows/assembly/GAC_MSIL/System.Xml/2.0.0.0__b77a5c561934e089/System.Xml.dll
    ----------------------------------------
    mscorlib.resources
        程序集版本: 2.0.0.0
        Win32 版本: 2.0.50727.4927 (NetFXspW7.050727-4900)
        基本代码: file:///C:/Windows/Microsoft.NET/Framework/v2.0.50727/mscorlib.dll
    ----------------------------------------
    System.Windows.Forms.resources
        程序集版本: 2.0.0.0
        Win32 版本: 2.0.50727.4927 (NetFXspW7.050727-4900)
        基本代码: file:///C:/windows/assembly/GAC_MSIL/System.Windows.Forms.resources/2.0.0.0_zh-CHS_b77a5c561934e089/System.Windows.Forms.resources.dll
    ----------------------------------------

    ************** JIT 调试 **************
    要启用实时(JIT)调试,
    该应用程序或计算机的 .config 文件(machine.config)的 system.windows.forms 节中必须设置
    jitDebugging 值。
    编译应用程序时还必须启用
    调试。

    例如: 

    <configuration>
        <system.windows.forms jitDebugging="true" />
    </configuration>

    启用 JIT 调试后,任何无法处理的异常
    都将被发送到在此计算机上注册的 JIT 调试器,
    而不是由此对话框处理。

     

    解决方案: 

    将dll里函数需要返回的局部变量声明为static。(就这么简单。原因就不重复了)


      

     

     

    教训: 

    1、不要犯经验主义的错误,有些经验可能是错误的。 

    2、发现bug要及时处理,不可为了赶工而忽略。随机性出现的bug更要注意,因为这类bug更难发现,也就更能解决。

  • 相关阅读:
    HashMap源码分析
    静态代理和装饰模式的区别
    自动内存管理
    ReentrantReadWriteLock
    ReentranLock
    对象的内存布局
    对象的创建
    [P2495][SDOI2011]消耗战——虚树
    [HDU2966]In case of failure——KD树
    [Gym-101158J]Coverthe Polygon with Your Disk——梯度下降,模拟退火
  • 原文地址:https://www.cnblogs.com/hfzsjz/p/1651406.html
Copyright © 2020-2023  润新知