我有一个基于Oracle的WinForms(.NET C#)OLTP应用程序。
从我们的支持环境中,我们经常会失去与数据库的连接,并生成一个生成的minidump文件(通过什么,我不完全确定) - 显然它不会导致应用程序崩溃,但为了实际做任何你必须关闭它并重新开始它。
在同一目录中创建了许多这样的小型转储之后,迷你转储突然开始得到相当奇怪的文件名,文件名在Windows上显然是“非法的”。
例如,我们有一个文件名,如: “°÷ƒ _minidump_default_pid_20248_tid_x19AC_2015_9_1_8_31_51.dmp“
是的,回车是文件名的一部分。
我们发现这是因为log4net监视目录,并且由于这些无效的文件名而突然开始咆哮未处理的例外情况。
所以我们试图找出为什么首先生成minidump,但问题是,我们能否以某种方式阻止使用无效的文件名生成minidump或以其他方式控制命名过程?
其次,是否有人知道为什么甚至可能首先创建无效的文件名?
更新 对于任何想要解决这个问题的人来说,首先要创建转储文件的原因,我们的问题是Windows在内存耗尽时生成它们,但由于某种原因,我们不会总是得到OOMException。
答案 0 :(得分:0)
首先,您应该尝试找出这些转储是如何生成的。微软例如使用名为LocalDumps的注册表项提供了一种很好的方法,它为我提供了很大的帮助。我确信这种方法不会产生如上所述的无效文件名。
其次,如果应用程序没有崩溃,它可能已经注册了unhandled exception handler。这基本上没问题,旨在编写崩溃转储,但未处理的异常由崩溃进程本身处理。处理这种情况的代码如何确保他自己不会受到崩溃的影响?更好的选择是让Windows作为操作系统来处理崩溃。然后Windows内核(不受崩溃影响)可以真正处理这种情况。这就是LocalDumps
的作用。
第三,通过以\\.\
开头的路径将Windows传递给Windows API,可以在Windows中直接访问文件系统。启动这样的路径将跳过任何文件名检查,因此您可以生成具有保留字符的文件,例如*
,?
,:
或您观察到的换行符。您的应用程序的未处理异常处理程序可能正在执行和受到崩溃的影响,其方式是部分文件名被覆盖。
Chkdsk
应该能够修复文件系统。
答案 1 :(得分:0)
请检查您是否从 \remoteserver\d$\client 等网络路径安装。
然后将其更改为 \remoteserver\d\clinet
共享路径中的“$”在提升权限文件的提取时产生问题