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