C# 应用程序在已部署 (.exe) 版本中因缓冲区溢出而崩溃,但在 Visual Studio 中则不然
Posted
技术标签:
【中文标题】C# 应用程序在已部署 (.exe) 版本中因缓冲区溢出而崩溃,但在 Visual Studio 中则不然【英文标题】:C# Application crashes with Buffer Overrun in deployed (.exe) version, but not in Visual Studio 【发布时间】:2011-01-28 17:13:52 【问题描述】:我有一个 c# Windows Forms 应用程序,它可以在 Visual Studio 中完美运行,但在部署并从 .exe 运行时会崩溃。它因缓冲区溢出错误而崩溃......而且很明显,这个错误不是从我的代码中抛出的。相反,windows 必须检测到某种缓冲区溢出并从外部关闭应用程序。我认为没有特定的代码行导致它..它只是间歇性地发生。
是否有人对缓冲区溢出错误的可能原因有任何想法,以及为什么它只会在部署的应用程序中发生,而不是在使用 Visual Studio 运行时发生?
提前致谢, 本
【问题讨论】:
你试过不同的电脑吗? 你能提供确切的错误吗? 谢谢。是的,它发生在多台 PC 上。我刚刚在下面的评论中发布了错误。 【参考方案1】:这是由行为不当的非托管 C/C++ 代码引起的错误。非托管 CRT 通过在堆栈帧中存储 cookie 来验证代码不会超出位于堆栈上的数组的末尾。当一个函数返回时,它会检查 cookie 是否仍然存在。如果不是,则假定某种恶意代码或 C/C++ 代码中的错误已经破坏了堆栈帧。公平的假设,这就是 90 年代后期大多数病毒感染的工作方式。
这是 C/C++ 代码中的错误的可能性约为 99.999%,机器受到攻击的可能性为 0.001%。您需要找到该 C/C++ 代码并联系编写该代码的程序员以修复错误。如果您不知道去哪里寻找,首先要怀疑任何类型的 ActiveX 控件或 COM 服务器。并将非托管模式下的调试器附加到程序的运行版本,以查看它加载了哪些 DLL。使用 Debug + Windows + Modules 并验证您是否可以考虑所有 DLL。
哦,崩溃详细信息将有助于本地化源代码。
【讨论】:
【参考方案2】:你必须更具体。
通常你有一些错误的非托管代码。
【讨论】:
确切的错误是:MyApplication.exe 发生缓冲区溢出,损坏了程序的内部状态。按 Break 调试程序或按 Continue 终止程序。很难提供代码......我无法确定它在哪里崩溃!我正在向几乎每一行代码添加日志语句,但到目前为止我还没有检测到模式。 为什么不按错误状态“按中断调试程序”?为什么不尝试将应用程序附加到 Visual Studio 中的调试器(当然,您的应用程序应该在调试模式而不是发布模式下运行)?你在使用不安全的代码块吗?以上是关于C# 应用程序在已部署 (.exe) 版本中因缓冲区溢出而崩溃,但在 Visual Studio 中则不然的主要内容,如果未能解决你的问题,请参考以下文章
HashAlgorithm.Create 在 C# ASP.NET Core 2 中因 PlatformNotSupportedException 而失败
C# Winforms 软件部署 (setup.exe) 后数据库连接会发生啥?
IErrorInfo.GetDescription 在 asp.net c# 中因 E_FAIL(0x80004005) 而失败?