c# - 我可以防止无效的小型转储文件名吗

标签 c# .net oracle debugging minidump

我有一个基于 Oracle 的 WinForms (.NET C#) OLTP 应用程序。

在我们的支持环境中,我们经常会遇到与数据库连接丢失的情况,并且会生成一个小型转储文件(具体是什么,我不完全确定)——显然它不会导致应用程序崩溃,但为了实际上做任何你必须关闭它并重新启动它的事情。

在同一个目录中创建了许多这样的小型转储之后,小型转储突然开始出现相当奇怪的文件名,这些文件名在 Windows 上显然是“非法”的。

例如我们有一个文件名:

"°÷ƒ _minidump_default_pid_20248_tid_x19AC_2015_9_1_8_31_51.dmp"

是的,回车是文件名的一部分。

我们发现这一点是因为 log4net 监视目录并且由于这些无效的文件名突然开始发出未处理的异常。

因此,我们首先要弄清楚为什么会生成小型转储,但这里的问题是,我们能否以某种方式防止使用无效文件名生成小型转储或以其他方式控制命名过程?

其次,有人知道为什么一开始就可以创建无效的文件名吗?

更新: 对于任何看到这个试图弄清楚为什么首先创建转储文件的人来说,我们的问题是 Windows 在内存快用完时生成它们,但由于某种原因我们不会总是得到 OOMException。

最佳答案

首先,您真的应该尝试找出这些转储是如何生成的。微软例如提供了一种使用名为 LocalDumps 的注册表项的好方法这为我提供了很大的帮助。我确信这种方法不会像上面那样生成无效的文件名。

其次,如果应用程序没有崩溃,它可能已经注册了一个unhandled exception handler。 .这基本上没问题,旨在编写故障转储,但未处理的异常由崩溃进程本身处理。处理这种情况的代码如何确保他自己没有受到崩溃的影响?更好的选择是让 Windows 作为操作系统来处理崩溃。然后 Windows 内核(不受崩溃影响)才能真正处理这种情况。这就是 LocalDumps 所做的。

第三,在将文件系统传递给 Windows API 时,可以通过以 \\.\ 开头的路径直接访问文件系统。启动这样的路径将跳过任何文件名检查,因此您可以生成具有保留字符的文件,例如 *?: 或换行符被你观察到。您的应用程序的未处理异常处理程序可能正在执行此操作,并且受到崩溃的影响,部分文件名被覆盖。

Chkdsk 应该可以修复文件系统。

关于c# - 我可以防止无效的小型转储文件名吗,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32328325/

相关文章:

c# - 是否可以在核心之间划分工作?

c# - Guid 全部为 0(零)?

c# - MongoDB .net 驱动程序 - 获取 MongoDB 服务器版本

sql - Oracle SQL : Detecting breaks in continual spans

c# - 最简单的 Paint 程序无法在 C# Windows 窗体中运行

c# - 三元运算符如何工作?

c# - 在独立应用程序上使用 ADFS 进行 Windows 身份验证

.net - 在线 .NET IDE?

sql - 使用花括号和通配符转义 Oracle 文本

java - 如何在 Spring Data Jpa 中使用自然排序