我正在使用Visual Studio 2010,并在C#中编码。我有一个我在项目中使用的第三方dll。当我尝试使用特定方法时,在看似随机的场合,程序只会崩溃,没有异常抛出。会议结束。有什么方法可以追踪正在发生的事情吗?
答案 0 :(得分:21)
在Windows中布局线程的堆栈的方式是这样的(粗略地说;这不是对所有内容的准确描述,只是足以给你提供要点。而CLR处理堆栈页面的方式是与非托管代码处理它的方式有些不同。)
在堆栈顶部,您正在使用所有已提交的页面。然后有一个“防护页面” - 如果你点击那个页面,那么防护页面就成了一个新的堆栈页面,下一页成为新的防护页面。但是,堆栈的 last 页面是特殊的。如果你点击一次,就会出现堆栈溢出异常。如果您点击两次,则该过程立即终止 。通过“立即”我的意思是“立即” - 没有例外,直接进监狱,不通过去,不收200美元。操作系统的原因是,此时该过程深深地患病并且可能已经变得对用户主动敌对。堆栈溢出,堆栈溢出的代码可能试图将任意多的垃圾写入内存。 (*)
由于该过程可能对自身和其他人造成危害,因此操作系统会将其删除而不允许运行任何代码。
我怀疑你的非托管代码中的某些内容会在最后一次堆栈页面中出现两次。几乎每次我看到一个过程突然消失,没有异常或其他解释,因为“不要弄乱我”堆栈页面被击中。
(*)早在20世纪90年代初,我就开发了一个名为NetWare的小型操作系统的数据库驱动程序。它没有这种类型的保护,现在更常见的操作系统。我需要能够在内核保护级别运行时“动态切换堆栈”;我知道当我的驱动程序意外烧坏堆栈时,因为它最终会写入屏幕内存,然后我可以通过查看直接写入屏幕的垃圾来调试问题。啊,那些日子。
答案 1 :(得分:3)
尝试强制调试器捕获甚至处理的异常 - 尤其是访问冲突和堆栈溢出等错误的异常。你可以在Debug - >中做到这一点。例外。 第三方DLL可能会捕获所有异常,然后调用exit()或退出整个程序的一些类似的美。
答案 2 :(得分:3)
您检查过 Windows事件日志吗?您可以在管理工具菜单中访问该菜单>事件查看器。特别检查应用程序和系统日志。
答案 3 :(得分:0)
如果使用Runtime Flow(由我开发)管理您的第三方dll,您可以看到崩溃之前发生的事情 - 堆栈溢出,强制退出或异常将清晰可识别。