应用程序启动时clr.dll中的缓冲区溢出

时间:2015-12-10 22:25:48

标签: c# winforms clr buffer-overflow buffer-overrun

我有两台电脑。两者都在Windows 7 Embedded下运行,并且安装了相同版本的.Net 4.0框架。 我的WinForms应用程序在其中一个应用程序上没有问题,但在另一个启动时在clr.dll中启动时失败了。

Problem Event Name: BEX
Application Name:   Myapplication.exe
Application Timestamp:  5669ec33
Fault Module Name:  clr.dll
Fault Module Version:   4.0.30319.526
Fault Module Timestamp: 4eb3b6b1
Exception Offset:   002b65ec
Exception Code: c0000409
Exception Data: 00000000
OS Version: 6.1.7601.2.1.0.320.65
Locale ID:  1033
Additional Information 1:   a835
Additional Information 2:   a835052745ddb3bce091e0cd181de7e7
Additional Information 3:   7cb8
Additional Information 4:   7cb8eec426d05584b36071af9d74719d

什么是非常"奇怪"

我能够在我的应用程序中发现两件事情,不知何故会产生影响或引发这个问题。 首先我找到了确切的代码行。我在UI线程上手动创建了几个按钮。如果我删除下一行,我的应用程序就会启动。

btn.Font = new Font("Tahoma", 9, FontStyle.Bold, GraphicsUnit.Point, 0);

其次我注意到如果我使用我的调试记录器使用StackFrame来查找日志消息的来源,应用程序将在CLR中崩溃,但在其他地方会出现相同的错误。不是我上面提到的那条线。

我的两台电脑有不同的内存。 2GB和1GB。应用程序在第二个1GB内存上失败。但应用程序使用30 MB,系统有大约350 MB的可用内存。 记忆可能是一个原因吗?

我的研究大部分都提到了微软发布的不同热门修补程序。我尝试了但没有任何帮助。我也尝试安装.Net v4.5,但结果相同。

我还能在哪里开始寻找问题?

...是的,运行带有附加调试器的应用程序时,这个问题不会出现。

更新

我刚刚意识到"异常代码:c0000409" 表示STATUS_STACK_BUFFER_OVERRUN。这为我所拥有的奇怪的应用程序行为带来了一些意义,但仍然不清楚为什么它在一台计算机上运行但在另一台计算机上不起作用

1 个答案:

答案 0 :(得分:0)

终于找到了解决方案

我的应用程序使用第三方C#库,它实际上是对其他本机库的调用之上的包装器。我反编译了库并意识到调用约定被设置为 CallingConvention.Cdecl ,但正如我在Dependency Walker应用程序中看到的那样,本机库中的所有方法都有 CallingConvention.StdCall

更改调用约定并重新编译库后,问题就消失了。