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

时间:2013-03-15 18:13:28

标签: sql-server sql-server-2005 memory c#-2.0 rope

这是让你想要找到一条漂亮绳索的问题之一。这个问题比不公布想要借钱的姐夫停止更令人讨厌。

让我先提前表示,我真的很感谢在这个问题上给予的任何帮助。

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

我们将其用作调用不同存储过程的工具。此应用程序执行一些日志记录,并且大部分工作得很好。

应用程序从XML文件中读取存储过程名称和参数。它设置了一个连接字符串和SQL Command对象(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上的内存以尝试复制此错误吗?

是否有人知道可能导致此类错误的常见编码问题?

有人可以借用一些绳子吗?

2 个答案:

答案 0 :(得分:3)

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

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

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

答案 1 :(得分:2)

  

“0x7c82c912”处的指令引用“0x00000000”

处的存储器

这是access violation

  

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

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

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