- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
这是我几天前发现的,我从this question 得到确认它不仅限于我的机器。 .
重现它的最简单方法是启动一个 Windows 窗体应用程序,添加一个按钮并编写以下代码:
private void button1_Click(object sender, EventArgs e) {
MessageBox.Show("yada");
Environment.Exit(1); // Kaboom!
}
Exit() 语句执行后程序失败。在 Windows 窗体上,您收到“创建窗口句柄时出错”。
启用非托管调试可以使发生的事情变得更加清晰。 COM模态循环正在执行并允许传递 WM_PAINT 消息。这对处置形式来说是致命的。
到目前为止我收集到的唯一事实是:
我特别感兴趣的是您可以采取哪些措施来避免这次崩溃。特别是 AppDomain.UnhandledException 场景让我很困惑;终止 .NET 程序的方法不多。请注意,调用 Application.Exit() 或 Form.Close() 在 UnhandledException 的事件处理程序中无效,因此它们不是解决方法。
更新:Mehrdad 指出终结器线程可能是问题的一部分。我想我看到了这一点,并且还看到了 2 秒超时的一些证据,表明 CLR 让终结器线程完成执行。
终结器位于 NativeWindow.ForceExitMessageLoop() 内部。那里有一个 IsWindow() Win32 函数,它大致对应于代码位置,在 32 位模式下查看机器代码时偏移 0x3c。 IsWindow() 似乎陷入了僵局。然而,我无法获得良好的内部堆栈跟踪,调试器认为 P/Invoke电话刚回。这很难解释。如果您可以获得更好的堆栈跟踪,那么我很乐意看到它。我的:
System.Windows.Forms.dll!System.Windows.Forms.NativeWindow.ForceExitMessageLoop() + 0x3c bytes
System.Windows.Forms.dll!System.Windows.Forms.NativeWindow.Finalize() + 0x16 bytes
[Native to Managed Transition]
kernel32.dll!@BaseThreadInitThunk@12() + 0xe bytes
ntdll.dll!___RtlUserThreadStart@8() + 0x27 bytes
ntdll.dll!__RtlUserThreadStart@8() + 0x1b bytes
ForceExitMessageLoop 调用之上没有任何内容,启用了非托管调试器。
最佳答案
我就此问题联系了 Microsoft,这似乎已经奏效。至少我想是这样的:)。虽然我没有从他们那里得到解决方案的确认,但很难直接联系 Windows 组,我不得不使用中介。
通过 Windows Update 提供的更新解决了这个问题。崩溃前明显的 2 秒延迟不再存在,强烈表明 IsWindow() 死锁已解决。程序干净可靠地关闭。本次更新为 Windows Defender、wdboot.sys、wdfilter.sys、tcpip.sys、rpcrt4.dll、uxtheme.dll、crypt32.dll 和 wintrust.dll 安装了补丁
Uxtheme.dll 是个奇怪的东西。它实现了 Visual Styles 主题 API,并由该测试程序使用。我不能确定,但我的钱花在了那个问题的根源上。 C:\WINDOWS\system32 中的副本版本号为 6.2.9200.16660,于 2013 年 8 月 14 日在我的机器上创建。
结案。
关于c# - 为什么 Environment.Exit() 不再终止程序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18036863/
我想在 32 位 Windows 上获取路径 system32 路径,在 64 位 Windows 上获取路径 SysWOW64。 Environment.GetFolderPath(Environm
我可以在 environment.yml 中设置环境变量吗? conda 中的文件环境? conda 让我 save environment variables in environments通过 e
我一直在尝试大部分 Enviroment.SpecialFolder 枚举,但我认为没有任何方法可以通过枚举。使用 string.Substring() 方法给我带来了最大的收获。 我尝试只获取实际安
当我在 .ios 项目的 appDelegate 中使用 Environment.GetFolderPath(Environment.SpecialFolder.Personal) 时,我得到一个路径
我找到了 this project在做一些研究的同时。我注意到 Docker Compose 示例文件中的这一行: environment: &environment 所以我想知道它实际上意味着什么?
在 python/flask/gunicorn/heroku 堆栈上,我需要根据另一个 env 变量的内容设置一个环境变量。 作为背景,我在 heroku 上运行了一个 python/Flask 应用
我正在尝试使用 angularfire @angular/[email protected] 构建 Angular 15 。但我遇到了这个错误 ✔ Downloading configuration
我在我的一位客户的计算机上遇到了一个非常奇怪的行为,我找不到任何线索来解释为什么会这样:当应用程序调用 Environment.GetFolderPath(Environment.SpecialFol
我遇到了以下方法: Environment.getDataDirectory() : /data 和 getFilesDir() : /data/data/package/files 一种方法使用环境
我在 rails 中有一个迁移,它执行以下操作: class AddMissingIndexes :evid, :length => { :evid => 255 } end end 但是,在对
所以我对 MS Stack Development 世界相当陌生,面临着本地开发环境与服务器环境不同的问题(我认为它们是一样的,但我错了)。 我的设置是使用 Visual Studio 2012(II
我有一个只包含 exe 文件(没有源代码)的 hello 工具。 你好工具结构: bin helloBin.exe helloRoot.exe conanfile.py conanfile.py
我是 R 的新用户,我尝试了以下代码。它给出了一个错误。任何人都可以帮忙吗?代码是: library(ggplot2) data(diamonds) qplot(price, data=diamond
我正在使用以下方法获取 Windows 7 中“我的文档”文件夹的路径并遍历其目录: Dim diri As New DirectoryInfo(Environment.GetFolderPath(E
我试图通过更改其环境变量来修改 Linux 上 JetBrains Rider 中 .NET 项目的设置配置文件。但是,当我点击文件夹图标时,我无法点击添加、删除或修改任何环境变量。 我注意到在 Ri
这个问题已经有答案了: How to add package to conda environment without pip (5 个回答) 已关闭 1 年前。 我在没有连接到互联网的计算机上安装了
我开发了一个 Controller 来使用 JSON 响应 AJAX 请求: class PeopleController extends Controller { public function l
我有一个 asp.net mvc3 应用程序。现在我想将用户数据保存在 C:\Users{AppPoolUserAccount}\AppData\Roaming\MyProgramm... 在第一次调
#include #include #include extern char *environ[]; int main(int argc, char *argv[]) { int ind
我在将 json 文件导入 typescript 时遇到问题。我已经按照惯例配置了tsconfig.json,但是在environment.ts文件中还是不行,但是在environment.prod.
我是一名优秀的程序员,十分优秀!