2010-06-21 67 views
9

展鹏有error reporting tool,指出它可以异常后C#中局部变量的值?

“让你的程序 的完整状态时坠毁(不只是堆栈 跟踪),其中包括 变量的值,当事故发生 - 无必须在 与最终用户的 无效的电子邮件对话中来回移动。“

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

有没有人有任何想法?

回答

13

看来他们所做的是他们重写你的程序集并在每个方法中添加一个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; 
} 

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

+0

这真的很棒。我认为这种机制应该以某种方式构建到.NET中,可能通过可选属性(Post#?)。 – Grozz 2012-08-18 00:59:34

+0

程序集没有局部变量名称。知道var1是foo和var2是酒吧并不总是有用。 – 2017-01-09 08:36:47

-1

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

+3

除非他们没有。局部变量和参数经常被注册。 – 2010-06-22 02:53:55

5

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

说了这么多,我想他们可能安装某种全局错误处理程序(有甚至catch或finally块之前执行异常过滤器),它抓住了使用本地代码堆栈的内容。这可以访问本地变量。

基本上,如果它在解开之前设法抓住堆栈(但它们是这样做的),它们可以获得本地变量。如果RedGate代码只在达到最高级别时才涉及,我怀疑它只会是堆值。

您是否试过自己的产品?你能链接到它吗?

+0

另一个引用:“但是这个详细的异常报告不仅仅是一个堆栈跟踪:它为您提供了失败调用中涉及的所有变量的值。” (http://www.red-gate.com/products/smartassembly/walkthrough_error_reporting.htm) – ConsultUtah 2010-06-24 16:34:30

+0

@consultutah:从屏幕截图中不清楚它们的含义。为什么不只是免费试用,看看? – 2010-06-24 16:39:13

+0

刚刚通过验证。它确实得到了参数和当地人的价值。我已经知道现在怎么样,也不太喜欢它。我会在一分钟后发布答案。 – ConsultUtah 2010-06-24 16:58:20

0

他们可能正在进行崩溃转储,其中包括整个程序存储器和所有寄存器值以及大量的元数据。这真的可以让你恢复一切关于你的程序崩溃时的状态。

0

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

2

他们不是在谈论异常处理程序,而是关于在这一点上干涉的事情,例外是抛出

+0

好点 - 我将编辑上述内容。 – ConsultUtah 2010-06-24 16:35:37

0

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