我能防止无效的小型转储文件名吗?

4

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

我们经常从支持环境中遇到与数据库的连接丢失,随之会生成一个所谓的minidump文件(由什么生成的,我不是完全确定) - 显然它不会导致应用程序崩溃,但为了做任何事情,您必须关闭它并重新启动。

在同一目录下创建了许多这样的minidumps之后,突然间这些minidumps开始使用相当奇怪的文件名,这些文件名显然在Windows上是“非法”的。

例如,我们有一个文件名:

"°÷ƒ _minidump_default_pid_20248_tid_x19AC_2015_9_1_8_31_51.dmp"

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

我们发现了这一点,因为log4net监视该目录,所有的突然开始因这些无效的文件名而出现未处理的异常。

因此,我们正在努力弄清楚为什么首先会生成minidump文件,但问题在于,我们是否可以以某种方式防止生成具有无效文件名的minidump文件或以其他方式控制命名过程?

其次,有人知道为什么首先可以创建无效文件名吗?

更新: 对于任何想要查看此内容的人,试图弄清楚为什么会创建转储文件,我们的问题是当Windows接近耗尽内存时,它会生成这些文件,但出于某种原因我们并不总是会得到OOMException。

2个回答

1

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

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

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

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


1
“有趣”的是,我的未处理异常处理程序没有生成转储。它基本上只是在消息框中显示异常(以及堆栈跟踪),并将异常记录到log4net。此外,似乎应用程序在此之后没有崩溃,因此这不是像StackOverflowException这样的“致命”异常。我们将查看更改LocalDumps位置,并查看是否会发生相同的情况。 - Esben Bach
仍在努力弄清楚是什么导致生成小型转储文件(因为这不是我们的代码),但按照链接中描述的配置注册表键似乎已经解决了无效文件名生成问题。 - Esben Bach

-1
请检查是否从网络路径安装,例如\remoteserver\d$\client。
然后将其更改为\remoteserver\d\clinet。
在提升权限文件上提取时,“$”在共享路径中会创建问题。

这个问题已经得到了回答,而且相当久远了,你的评论似乎并没有真正解决与该问题相关的任何问题。 - Esben Bach

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接