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



我有两台电脑。两者都在Windows 7 Embedded下工作,并安装了相同版本的.Net 4.0框架。我的 WinForms 应用程序在其中一个上没有问题,但在使用 clr 中的 BEX 启动时失败.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中崩溃并出现相同的错误,但在其他地方。不是在我上面提到的那条线上。

我的两台计算机具有不同的 RAM。 2GB 和 1GB。应用程序在具有 1GB 内存的第二个应用程序上失败。但是应用程序本身使用 30 MB,系统有 ~350 MB 的可用内存。记忆会是一个原因吗?

我的研究在很大程度上使我参考了Microsoft发布的不同修补程序。 我尝试了它们,但没有任何帮助。我也尝试安装 .Net v4.5,但结果相同。

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

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

更新

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

终于找到了解决方案

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

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

最新更新