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

Buffer Overflow in clr.dll at application start-up

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

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

什么很"strange"

我能够在我的应用程序中找到两件事,它们以某种方式影响或引发了这个问题。 首先我找到了确切的代码行.. 我有几个按钮是我在 UI 线程上手动创建的。如果我删除下一行,我的应用程序就会启动。

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

其次我注意到如果我使用我的调试记录器,它使用 StackFrame 来找出日志消息的来源,应用程序将崩溃并在 CLR 中出现相同的错误,但在某些情况下其他地方。不在我上面提到的那一行。

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

我的大部分研究都让我参考了 Microsoft 发布的不同修补程序。我试过了,但没有任何帮助。我也尝试安装 .Net v4.5,但结果相同。

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

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

更新

我刚刚意识到 "Exception Code: c0000409" 意味着 STATUS_STACK_BUFFER_OVERRUN。这让我对奇怪的应用程序行为有了一些了解,但仍然不清楚为什么它在一台计算机上工作但在另一台计算机上不起作用。

终于找到解决方案

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

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