有没有办法在我的 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# 应用程序中复制无法读取内存的错误消息?的主要内容,如果未能解决你的问题,请参考以下文章