如何转储我的缓冲区时,BSoD发生,使用c#

本文关键字:BSoD 发生 使用 缓冲区 我的 何转储 转储 | 更新日期: 2023-09-27 18:17:40

我为c#中的多个应用程序设计了一个日志服务。出于节省性能的考虑,所有的日志应该先存放在缓冲区中,待缓冲区写满后再写入日志文件。然而,有一些扩展卡(PCI/PCI-e)导致BSoD,这不在我的控制范围内。当BSoD发生时,缓冲区中的日志将丢失,但我想找到一种方法来保留它们。

我发现一些文章正在讨论如何在软件崩溃时转储数据。但是,minidump需要自己转储所有内容,我认为这会导致一些性能问题;其他条款(A)(B)只适用于单个应用程序崩溃。

谁有任何建议保存我的日志,即使BSoD发生?

编辑:如果有任何建议,以减少数据的损失,也欢迎。

如何转储我的缓冲区时,BSoD发生,使用c#

由于性能原因,c#应用程序中的缓冲区没有写入磁盘,因此留给它的唯一其他地方是内存(RAM)。由于您不知道Windows在崩溃时如何管理内存,因此我们必须考虑两种情况:a)日志确实在RAM中,b) RAM已交换到磁盘(页面文件)。要访问BSoD的所有内存,您必须配置Windows来创建一个完整的内存转储,而不是内核迷你转储。

蓝屏时,操作系统几乎不再依赖任何东西,甚至大多数内核驱动程序。它所做的唯一尝试是将物理RAM的内容写入磁盘。此外,由于它甚至不能依赖于有效的NTFS数据结构,所以它会写入它所知道的唯一的连续磁盘空间:页文件。这也是为什么您的页面文件需要至少与物理RAM和一些元数据一样大,否则它将无法保存信息的原因。

此时,我们已经可以给出情况b)的答案:如果您的日志实际上被交换到页面文件,它可能会被转储覆盖。

如果缓冲区确实是工作集(RAM)的一部分,则该部分将包含在内核转储中。从内核转储中调试。net应用程序几乎是不可能的,因为用于分析。net堆的SOS命令只适用于用户模式的全内存转储。如果您可以通过其他方式(例如某个子字符串)识别日志条目,您当然可以在内核转储中执行简单的字符串搜索。

总而言之,你想要达到的目标听起来像是一个xy问题。如果您想测试您的服务,为什么不删除或更换不相关的有问题的PCI卡或在不同的PC上进行测试?如果蓝屏日志记录是日志服务的显式功能,则应该将其视为一种风险,并在编写服务之前进行评估。这是一个项目管理问题,与StackOverflow无关。

不幸的是,我不得不证实@MobyDisk所说的:这(几乎)是不可能的,至少是不可靠的。