- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
我知道 .NET 中的 StackOverflowExceptions 无法被捕获、取消其进程并且没有堆栈跟踪。这是官方记录的 on MSDN .但是,我想知道这种行为背后的技术(或其他)原因是什么。 MSDN 所说的是:
In prior versions of the .NET Framework, your application could catch a StackOverflowException object (for example, to recover from unbounded recursion). However, that practice is currently discouraged because significant additional code is required to reliably catch a stack overflow exception and continue program execution.
这个“重要的附加代码”是什么?这种行为是否有其他记录在案的原因?即使我们抓不到 SOE,为什么我们至少不能得到堆栈跟踪?我和几位同事刚刚花了几个小时来调试生产 StackOverflowException,如果使用堆栈跟踪可能需要几分钟,所以我想知道我的痛苦是否有充分的理由。
最佳答案
线程的栈是由Windows创建的。它使用所谓的保护页面 来检测堆栈溢出。 this MSDN Library article 中描述的用户模式代码通常可用的功能.基本思想是堆栈的最后两页(2 x 4096 = 8192 字节)保留,任何处理器访问它们都会触发页面错误,该错误会变成 SEH 异常,STATUS_GUARD_PAGE_VIOLATION。 p>
在属于线程堆栈的那些页面的情况下,这被内核拦截。它更改了这 2 个页面中第一个页面的保护属性,从而为线程提供了一些紧急堆栈空间来处理事故,然后重新引发 STATUS_STACK_OVERFLOW 异常。
此异常又被 CLR 拦截。那时还剩下大约 3 KB 的堆栈空间。一方面,这不足以运行 Just-in-time编译器 (JITter) 来编译可以处理程序中异常的代码,JITter 需要比这更多的空间。因此,CLR 只能粗鲁地中止线程,不能做任何其他事情。并通过 .NET 2.0 策略也终止该进程。
请注意,这在 Java 中问题不大,它有一个字节码解释器,因此可以保证可执行的用户代码可以运行。或者在用 C、C++ 或 Delphi 等语言编写的非托管程序中,代码是在构建时生成的。然而,这仍然是一个非常难以处理的事故,堆栈中的紧急空间已用完,因此没有任何情况可以安全地继续在线程上运行代码。当一个线程在一个完全随机的位置中止并且处于损坏状态时,程序可以继续正确运行的可能性很小。
如果有任何努力考虑在另一个线程上引发事件或删除 winapi 中的限制(保护页面的数量不可配置)那么这要么是一个非常保守的 secret ,要么就是不是认为有用。我怀疑是后者,不知道是不是事实。
关于c# - 为什么 .NET 在抛出 StackOverflowException 时表现如此糟糕?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22465541/
我想在这里说的是我在从之前离开的相同状态重新启动我的应用程序时遇到的问题。我在这方面做了很多研发,并且已经解决了 stackoverflow 中发布的问题。所以请不要说它是重复的。 我试过设置这些选项
当我在我的类中实现 __cmp__ 函数时,python 是否会在内部重载“==”,我们在 C++ 中是如何做到的? 只是好奇。我是 python 的新手。 :) 最佳答案 ==的含义当您定义 __c
我在 Raspberry Pi2 上安装了 Gitlab,几个月来它运行良好。但自从关闭了RPi的电源后,它就不再起作用了。网页返回502错误。 502 Whoops, GitLab is takin
有人知道用户登陆带有Webfonts的页面时为什么Google Chrome浏览器崩溃吗 它并不会一直发生,而是经常发生 我刚得到一个蓝屏页面,却不知道为什么:该页面不是来自重定向时就很好了。 这是我
当我登录时,Skype始终会给出此错误。 糟糕,Skype存在问题。尝试注销然后重新登录。 STARTUP_LOAD_ERROR MACBOOK 最佳答案 Macbook 用户 退出Skype 回家
我正在尝试从 flutter 开始,首先我在 cmd 上运行 flutter doctor 它有效。在我安装了 ANDROID SDK 之后,同样的命令 flutter doctor 给了我异常:
从 android studio 终端运行 flutter attach 不工作。显示错误flutter 意外退出。 终端输出: flutter attach Checking for adverti
当使用 TinyMCE 4 测试所有浏览器时,Chrome 非常慢。 (我尝试从 TinyMCE 中删除所有插件,但没有任何区别。) Chrome 需要大约 20-25 秒在 TinyMCE 中呈现一
我试图让下面的脚本工作,以便从远程服务器(服务器 1)读取特定目录中的 CSV 文件列表,并将数据移植到另一台服务器的 PostgreSQL 数据库中。 我已经创建了一个 rsa SSH key 并将
在嵌入式 linux 环境中(在 PowerPC 上定制的 2.4.25)几个小时后我得到以下内核 panic : Oops: kernel access of bad area, sig: 11 N
在将现有 Node.js (Hapi.js) + RethinkDB 从 OVH VPS(最小 vps)迁移到 AWS Lambda( Node )+ DynamoDB 的过程中,我最近遇到了一个非常
我是一名优秀的程序员,十分优秀!