0

我有两台电脑。两者都在 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

什么很“奇怪”

我能够在我的应用程序中找到两件事,它们会以某种方式影响或引发这个问题。 首先,我找到了确切的代码行。 我在 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,但结果相同。

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

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

更新

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

4

1 回答 1

1

终于找到解决方案

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

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

于 2015-12-11T20:32:38.343 回答