2

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

我有一个 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 上的内存以尝试复制此错误吗?

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

有人有绳子可以借吗?

4

2 回答 2

3

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

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

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

于 2013-03-15T18:21:08.123 回答
2

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

这是访问冲突

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

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

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

于 2013-03-15T18:28:35.043 回答