Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在x86中连接VS2010 SP1后不久,测试中的自由运行应用程序将退出_C#_.net_Debugging_C++ Cli - Fatal编程技术网

C# 在x86中连接VS2010 SP1后不久,测试中的自由运行应用程序将退出

C# 在x86中连接VS2010 SP1后不久,测试中的自由运行应用程序将退出,c#,.net,debugging,c++-cli,C#,.net,Debugging,C++ Cli,在Windows7x64上,当我以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继续运行

在Windows7x64上,当我以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)上看到的调用堆栈,可能与以下内容有关:

clr.dll__crt_调试器_hook()
clr.dll___报告\u gsfailure()+0xeb字节 clr.dll_DoJITFailFast@0()+0x8字节 clr.dll!CrawlFrame::SetCurGSCookie()+0x2e9c4f字节
clr.dll!StackFrameIterator::Init()+0x60字节
clr.dll!线程::StackWalkFramesEx()+0x8a字节
clr.dll!线程::StackWalkFrames()+0x87字节 clr.dll!CNameSpace::GcScanRoots()+0xd7字节 clr.dll!WKS::gc_堆::标记_阶段()+0xae字节
clr.dll!WKS::gc_heap::gc1()+0x7b字节
clr.dll!WKS::gc_堆::垃圾收集()+0x1c1字节
clr.dll!WKS::GCHeap::GarbageCollectGeneration()+0xba字节
clr.dll!WKS::gc_堆::尝试分配更多空间()+0x1cd0字节 clr.dll!WKS::gc_堆::分配更多空间()+0x13字节
clr.dll!WKS::GCHeap::Alloc()+0x507字节 clr.dll!Alloc()+0x5a字节
clr.dll!SlowAllocateString()+0x41字节
clr.dll!UnframedAllocateString()+0x11字节
clr.dll!StringObject::NewString()+0x26字节 clr.dll!Int64ToDecStr()+0x12e字节
clr.dll!COMNumber::FormatInt64()+0x17e字节 mscorlib.ni.dll!6c60b8e1()
[以下帧可能不正确和/或缺失,没有为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++语言是第一语言。托管代码落后,这不是托管执行环境中应该发生的事情

然而,与早期的CLR版本不同,版本4 CLR是在保护到位的情况下构建的。它也完成了它的任务,尽管它很少发生。我以前只见过一次关于它的问题


解决这个问题将是困难的,尤其是当您没有明显的线索导致应用程序中的非托管代码可能会使这种保护失效时。最好的办法是进行最少的修改,并联系Microsoft支持人员,向他们说明哪里出了问题。可能的结果是,在获取复制的过程中发现什么会绊倒它。

看起来我应该能够通过在代码中注入GC.Collect()调用来缩小它的范围:垃圾收集检查GSCookie等

断开的链接1:


断开的链接2:

您可能会在操作系统事件查看器中找到更多信息?@Jason Williams:事件查看器中没有任何内容。通过UNC路径或代码中受保护的位置进行良好的尝试访问?以特权用户身份运行是否可以解决问题?@Mike Miller:在开发设备上运行,完全特权,仅本地访问。从错误代码中,听起来好像有什么东西在破坏我的堆栈。祝你好运,请用结果更新,因为我现在比Bouncer在《邻居》(Bouncers Dream)中有他自己的插曲时更感兴趣——那太棒了。我提到过这是一个非常复杂的应用程序吗?我们有185条DllImport语句。昨天我删除了我的应用程序的层,看看是什么组件导致了它。我发现问题不是用P/UnjKE签名,而是在托管C++编写的预编译模块中,以.NET 4为目标。当调用托管C++时,不需要P/Unjk。它只是工作。或者不是,在我的例子中,我目前正在运行Jinx,无法强制代码路径失败。我仍然无法连接到免费运行的应用程序,因为它会立即退出。回想起来,我觉得这是我们所依赖的非托管库之一。一旦它被编译出来,就没有问题了。这篇文章中的链接目前生成了一条站点暂时不可用的消息@SteveMylroie,我查看了way back机器。档案中没有任何内容。尽管这两个链接现在都被破坏了,但这条评论帮助我发现了一个类似的问题(事实上是在P/Invoke调用中)。每当抛出异常时,我都会得到它,但是强制GC可以精确定位实际的bug+1行为在不同的平台上似乎有所不同。我在服务器2008 R2 x64上看到了GSCookie,但在Windows 7 x64上没有看到这样的消息。我接受了这个答案,因为它指出C/C++代码可能是罪魁祸首,在我的案例中,事实上确实如此。