RedGate有error reporting tool表示可以
“获取程序的完整状态 当它崩溃时(不只是堆栈 跟踪),包括的值 崩溃发生时的变量 - 无需来回走动 低效的电子邮件对话 最终用户。“
我已经为我们的应用程序构建了一个未处理的异常报告工具,但我无法想象他们如何获得生产代码中的堆栈跟踪信息。
有没有人有任何想法?
答案 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)
局部变量存储在堆栈中(与参数相同)。