c# – 在x86中使用VS2010 SP1连接后不久,测试中的自由运行应用程序退出
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了c# – 在x86中使用VS2010 SP1连接后不久,测试中的自由运行应用程序退出,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2617字,纯文字阅读大概需要4分钟。
内容图文
在Windows 7 x64上,当我在x86模式下连接到相当复杂的自由运行的应用程序时,它会运行一段时间,然后可重复地退出.
MyApp.exe Managed (v4.0.30319)' has exited with code -1073740791 (0xc0000409).
紧随其后
MyApp.vshost.exe: Managed (v4.0.30319)' has exited with code 0 (0x0).
有时如果它运行正常,它会打到我的断点,我将检查状态,但当我按F5继续前进时,应用程序以相同的方式退出.
快速搜索错误代码告诉我它是堆栈缓冲区溢出.我听说它可能是由不正确的非托管互操作代码引起的.
我可以从调试器OK(F5)运行,但是自由运行和连接总是有这个问题.
有关如何缩小范围的任何想法?
编辑:这是我在不同的机器(Windows Server 2008 R2 x64)上看到的一个callstack,可能是相关的:
clr.dll!__crt_debugger_hook()
clr.dll!___report_gsfailure() + 0xeb bytes
clr.dll!_DoJITFailFast@0() + 0x8 bytes
clr.dll!CrawlFrame::SetCurGSCookie() + 0x2e9c4f bytes
clr.dll!StackFrameIterator::Init() + 0x60 bytes
clr.dll!Thread::StackWalkFramesEx() + 0x8a bytes
clr.dll!Thread::StackWalkFrames() + 0x87 bytes
clr.dll!CNameSpace::GcScanRoots() + 0xd7 bytes
clr.dll!WKS::gc_heap::mark_phase() + 0xae bytes
clr.dll!WKS::gc_heap::gc1() + 0x7b bytes
clr.dll!WKS::gc_heap::garbage_collect() + 0x1c1 bytes
clr.dll!WKS::GCHeap::GarbageCollectGeneration() + 0xba bytes
clr.dll!WKS::gc_heap::try_allocate_more_space() + 0x1cd0 bytes
clr.dll!WKS::gc_heap::allocate_more_space() + 0x13 bytes
clr.dll!WKS::GCHeap::Alloc() + 0x507 bytes
clr.dll!Alloc() + 0x5a bytes
clr.dll!SlowAllocateString() + 0x41 bytes
clr.dll!UnframedAllocateString() + 0x11 bytes
clr.dll!StringObject::NewString() + 0x26 bytes
clr.dll!Int64ToDecStr() + 0x12e bytes
clr.dll!COMNumber::FormatInt64() + 0x17e bytes
mscorlib.ni.dll!6c60b8e1()
[Frames below may be incorrect and/or missing, no symbols loaded for mscorlib.ni.dll]
EDIT2应用程序的x64版本似乎很好,问题只出现在x86中.
解决方法:
从Windows SDK ntstatus.h头文件:
//
// MessageId: STATUS_STACK_BUFFER_OVERRUN
//
// MessageText:
//
// The system detected an overrun of a stack-based buffer in this application. This overrun
// could potentially allow a malicious user to gain control of this application.
//
#define STATUS_STACK_BUFFER_OVERRUN ((NTSTATUS)0xC0000409L) // winnt
堆栈分配缓冲区上的缓冲区溢出是臭名昭着的病毒注入向量.微软非常认真地消除了代码中潜在的线程. C和C语言是第一个.托管代码落后,这不是应该在托管执行环境中发生的事情.
尽管如此,版本4 CLR是在保护措施的基础上构建的,与早期的CLR版本不同.它发挥了作用,尽管它的发生极为罕见.我之前只见过一次关于它的问题.
解决这个问题将很困难,尤其是当你没有明显的导致你的应用程序中的非托管代码可能会绊倒这种保护时.最好的办法是制作一个最小的repro并联系Microsoft支持人员向他们展示出现了什么问题.在找到repro的同时找出它的行程是可能的结果.
内容总结
以上是互联网集市为您收集整理的c# – 在x86中使用VS2010 SP1连接后不久,测试中的自由运行应用程序退出全部内容,希望文章能够帮你解决c# – 在x86中使用VS2010 SP1连接后不久,测试中的自由运行应用程序退出所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。