有没有办法在我的 C# 应用程序中复制无法读取内存的错误消息?

Posted

技术标签:

【中文标题】有没有办法在我的 C# 应用程序中复制无法读取内存的错误消息?【英文标题】:Is there any way to replicate a memory can't be read error message in my C# application? 【发布时间】:2013-03-15 18:13:27 【问题描述】:

让我先声明,我非常感谢在此问题上提供的任何帮助。

我有一个 C# (2.0) 应用程序。这是一个相对简单的应用程序,它基于作为命令行参数传递的 XML 文件执行存储过程。

我们使用它作为调用不同存储过程的工具。此应用程序会进行一些日志记录,并且在大多数情况下运行良好。

应用程序从 XML 文件中读取存储过程名称和参数。它设置了一个连接字符串和 SQL 命令对象 (System.Data.SqlClient.SqlCommand)。

然后它使用 ExecuteReader 方法运行存储过程。

不幸的是,这个应用程序在少数情况下产生了以下错误:

    “Application popup: StoredProcLauncher.exe - Application Error : The instruction
 at "0x7c82c912" referenced memory at "0x00000000". The memory could not be "read”

此错误已出现在多个服务器上,因此它一定是代码问题。

似乎当我们的生产服务器滚动到某个数字时,它会发出这个内存错误。

问题是我在开发中没有看到这个问题。我无法复制它,所以我被卡住了。

有没有办法模拟这个错误。我可以以某种方式填充本地 PC 上的内存以尝试复制此错误吗?

有谁知道一些常见的编码问题可能会导致这样的错误?

有人有绳子可以借吗?

【问题讨论】:

一方面,您可以将堆栈跟踪写入 Windows 应用程序事件日志(或文本文件或电子邮件等),以便下次在服务器上发生时,您可以查看堆栈跟踪并获取一些行号。 谢谢你,这很有帮助。请发布一个答案,以便我可以给你一些 *** 的爱。 【参考方案1】:

这样做的一种方法是将有问题的代码包装在 try catch 块中,并将堆栈跟踪和错误消息写入 Windows 应用程序事件日志、文本文件、电子邮件等。

这将为您提供一些行号和其他信息。

另外请注意,您可能需要在调试模式下部署它,或者至少复制带有应用程序 exe/dll 的 .pdb 文件,以便它可以获取调试符号。我不记得它是如何工作的,但我认为当你在发布模式下部署时,你可能会丢失一些有价值的调试信息。

【讨论】:

【参考方案2】:

“0x7c82c912”处的指令引用了“0x00000000”处的内存

这是access violation:

当代码尝试读取或写入尚未分配或无权访问的内存时,在非托管或不安全代码中会发生访问冲突。这通常是因为指针的值不正确。

为什么您的程序有非托管/不安全的代码?为了做你描述的事情,它不需要本机代码。

唉,代码崩溃了,现在不是想知道如何最终调用本机代码的时候。要解决这个问题,您将不得不捕获转储并分析转储。见Capturing Application Crash Dumps。有专门针对此的工具,例如breakpad。还有一些服务可以帮助您收集和跟踪应用程序产生的崩溃,例如crittercism.com 或AirBrake。我什至为自己创建了一个并将其公开bugcollect.com。

【讨论】:

以上是关于有没有办法在我的 C# 应用程序中复制无法读取内存的错误消息?的主要内容,如果未能解决你的问题,请参考以下文章

从内存流中读取存储的 PDF

如何获取其他程序内存的地址,然后在我的程序中读取

在我的 C# 应用程序中禁用 Windows 字体大小增加

C# 使用大数组内存溢出的解决办法

Visual Studio C# 试图读取或写入受保护的内存。这通常表明其他内存已损坏

有没有办法在 python 中运行 C# 的不和谐 SDK 代码?