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

C# 我可以防止无效的小型转储文件名吗,c#,.net,oracle,debugging,minidump,C#,.net,Oracle,Debugging,Minidump,我有一个基于Oracle的WinForms(.NET C#)OLTP应用程序 从我们的支持环境中,我们经常会遇到与数据库的连接中断,并生成一个小型转储文件(我不完全确定是由什么产生的)——显然它不会导致应用程序崩溃,但为了实际执行任何操作,您必须关闭它并重新启动它 在同一个目录中创建了许多这样的小转储之后,突然这些小转储开始获得非常奇怪的文件名,这些文件名在windows上显然是“非法”的 例如,我们有一个文件名,如: "°÷ƒ _小型转储\u默认\u pid\u 20248\u tid\u x

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

从我们的支持环境中,我们经常会遇到与数据库的连接中断,并生成一个小型转储文件(我不完全确定是由什么产生的)——显然它不会导致应用程序崩溃,但为了实际执行任何操作,您必须关闭它并重新启动它

在同一个目录中创建了许多这样的小转储之后,突然这些小转储开始获得非常奇怪的文件名,这些文件名在windows上显然是“非法”的

例如,我们有一个文件名,如: "°÷ƒ _小型转储\u默认\u pid\u 20248\u tid\u x19AC\u 2015\u 9\u 1\u 8\u 31\u 51.dmp“

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

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

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

第二,有人知道为什么一开始就有可能创建无效的文件名吗

更新:
对于任何想弄清楚转储文件为什么会首先被创建的人来说,我们的问题是Windows在几乎耗尽内存时生成了转储文件,但由于某些原因,我们不会总是得到OOMEException

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

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

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


Chkdsk
应该能够修复文件系统。

有趣的是,我的未处理异常处理程序没有生成转储。它基本上只是在messagebox中显示异常(以及堆栈跟踪),并将异常记录到log4net。另外,应用程序似乎没有在崩溃后崩溃,因此它不是StackOverflowException之类的“致命”异常。我们将查看更改LocalDumps位置的情况,并查看是否发生了相同的情况。仍在尝试找出到底是什么导致生成了MinidDumps(因为这不是我们的代码),但按照链接中描述的方式配置注册表项似乎已修复了无效文件名生成问题。