异常后C#中局部变量的值?

时间:2010-06-21 19:00:42

标签: c# .net debugging

RedGate有error reporting tool表示可以

  

“获取程序的完整状态   当它崩溃时(不只是堆栈   跟踪),包括的值   崩溃发生时的变量 -   无需来回走动   低效的电子邮件对话   最终用户。“

我已经为我们的应用程序构建了一个未处理的异常报告工具,但我无法想象他们如何获得生产代码中的堆栈跟踪信息。

有没有人有任何想法?

8 个答案:

答案 0 :(得分:14)

看来他们所做的就是重写你的程序集并在每个方法中添加一个try / catch块(除了你明确排除的那些)。 catch获取所有局部变量的值。所以,如果我有代码:

private int Add(int o1, int o2) {
  return o1+o2;
}

它会将其修改为:

private int Add(int o1, int o2) {
  int ret = 0;
  try {
    ret = o1+o2;
  }
  catch (Exception e) {
    SpecialExceptionHandler.HandleException(e, new object[]{o1, o2});
  }
  return ret;
}

非常棘手......所以,它会在异常发生的时候显示参数和本地人的价值。

答案 1 :(得分:5)

嗯,是否说本地变量?在你引用的文章中没有这么说。我怀疑它会进行堆转储,并允许您检查静态和实例变量。

话虽如此,我认为他们可以安装某种全局错误处理程序(有一些异常过滤器甚至在catch或finally块之前执行),它们使用本机代码抓取堆栈的内容。这可以提供对局部变量的访问。

基本上,如果它在解开之前设法抓住堆栈(但是他们这样做),他们可以得到你的局部变量。如果RedGate代码只有在达到顶层时才会介入,我怀疑它只是堆值。

你自己试过这个产品吗?你能链接到它吗?

答案 2 :(得分:2)

他们不是在谈论异常处理程序,而是关于在抛出的异常点处进行调解的内容。

答案 3 :(得分:0)

他们可能正在进行崩溃转储,其中包括整个程序内存和所有寄存器值,以及大量的元数据。这确实允许您在程序崩溃时恢复所有有关程序状态的信息。

答案 4 :(得分:0)

我不确定RedGate是如何做到这一点的,但是Visual Studio 2010引入了一个名为IntelliTrace的新功能,可以做类似的事情......也许它基于此?

答案 5 :(得分:0)

纯托管代码无法实现。您可以使用调试API执行此操作。这可能有助于http://msdn.microsoft.com/en-us/library/bb384652(VS.90).aspx

答案 6 :(得分:0)

我不知道详细信息,但Microsoft为.NET程序提供了调试API和一个名为SOS的特殊调试DLL。也许RedGate正在使用这样的调试API来检查局部变量和其他程序“根”。从理论上讲,它可以使用调试API来捕获当检测到异常/崩溃未处理时存在的所有对象的状态。

答案 7 :(得分:-2)

局部变量存储在堆栈中(与参数相同)。