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 nder, 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.OnMouUp(MouEventArgs mevent)
在 System.Windows.Forms.Control.WmMouUp(Message& m, MouButtons button, Int32 clicks)
在 System.Windows.Forms.Control.WndProc(Message& m)
在 System.Windows.Forms.ButtonBa.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/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/
----------------------------------------
System.Windows.Forms
程序集版本: 2.0.0.0
Win32 版本: 2.0.50727.4927 (NetFXspW7.050727-4900)
基本代码: file:///C:/windows/asmbly/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/asmbly/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/asmbly/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/asmbly/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/asmbly/GAC_MSIL/System.Xml/2.0.0.0__b77a5c561934e089/System.Xml.dll
----------------------------------------
程序集版本: 2.0.0.0
Win32 版本: 2.0.50727.4927 (NetFXspW7.050727-4900)
基本代码: file:///C:/Windows/Microsoft/Framework/v2.0.50727/mscorlib.dll
----------------------------------------
System.sources香蕉解酒吗
程序集版本: 2.0.0.0
Win32 版本: 2.0.50727.4927 (NetFXspW7.050727-4900)
基本代码: file:///C:/windows/asmbly/GAC_MSIL/System.sources/2.0.0.0_zh-CHS_b77a5c561934e089/System.sources.dll ----------------------------------------
************** JIT 调试 **************
要启⽤实时(JIT)调试,
该应⽤程序或计算机的 .config ⽂件(fig)的 system.windows.forms 节中必须设置
jitDebugging 值。
编译应⽤程序时还必须启⽤
调试。
例如:
<configuration>
<system.windows.forms jitDebugging="true" />
</configuration>
启⽤ JIT 调试后,任何⽆法处理的异常
都将被发送到在此计算机上注册的 JIT 调试器,
⽽不是由此对话框处理。
解决⽅案:
将dll⾥函数需要返回的局部变量声明为static。(就这么简单。原因就不重复了)
教训:
1、不要犯经验主义的错误,有些经验可能是错误的。
太阳星星月亮
2、发现bug要及时处理,不可为了赶⼯⽽忽略。随机性出现的bug更要注意,因为这类bug更难发现,也就更能解决。