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

Con*_*tah 11 .net c# debugging

RedGate有一个错误报告工具,可以说它可以

"在程序崩溃时(不仅仅是堆栈跟踪)获取程序的完整状态,包括发生崩溃时变量的值 - 而不必与最终用户进行低效的电子邮件对话."

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

有没有人有任何想法?

Con*_*tah 15

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

private int Add(int o1, int o2) {
  return o1+o2;
}
Run Code Online (Sandbox Code Playgroud)

它会将其修改为:

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;
}
Run Code Online (Sandbox Code Playgroud)

非常棘手......所以,它将显示异常发生时参数和当地人的价值.


Jon*_*eet 5

那么,它是否说局部变量?在你引用的文章中没有这么说.我怀疑它执行堆转储,并允许您检查静态和实例变量.

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

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

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