Tag: 堆栈跟踪

使用.net中用户错误报告的行号重新创建堆栈跟踪?

首先,问题是:我有几个免费项目,并且任何软件都包含bug。 一些用户遇到bug时会向我发送一个带有堆栈跟踪的bug报告。 为了简化查找​​故障位置,我想查看此堆栈跟踪中的行号。 如果应用程序没有.pdb文件,那么所有行信息都会丢失,因此目前我的所有项目都部署了.pdb文件,因此生成的堆栈跟踪具有此数字。 但! 但我不希望在发行版中看到这些文件,并希望删除所有.pdb。 它们会混淆用户,消耗安装程序中的空间等。 Delphi解决方案:很久以前,当我是一名delphi程序员时,我使用了以下技术:exception我的应用程序在堆栈上行走并收集地址。 然后,当我收到错误报告时,我使用了一个工具,根据收集的地址和位于MY机器上的相应符号文件,使用函数名称和行号重建有效的堆栈跟踪。 问题:在.NET中是否有任何lib,或技术或其他任何相同的操作? 状态更新:非常有趣,经常提出问题是开始自己调查的最佳方式。 例如,我想了一段时间这个问题,但几天前才开始寻找答案。 选项1:MiniDumps。 经过大量的谷歌搜索后,我找到了一种从代码创建迷你转储的方法,以及如何从托管迷你转储中重新创建堆栈。 可再发行程序集以创建迷你转储表单代码 – clrdump 关于使用以前的程序集的博客文章 – 在.NET生产应用程序中创建和分析minidump 然而,该解决方案需要重新分配两个额外的组件(大小约为1mb),并且小型转储需要一些空间,并且用户通过电子邮件发送它们是不舒服的。 所以对于我的目的,现在,这是不可接受的。 选项2:感谢weiqure提供线索。 可以为每个堆栈帧提取受管理的IL偏移量。 现在问题是如何根据此偏移从.pdb获取行号。 我发现了什么: PDB File Internals ,仅供参考,因为: ISymbolReader – 用于读取程序数据库文件的托管接口 最后是一个将.pdb文件转换为结构化xml以便于xpath处理的工具 使用此工具,可以为每个发布版本创建xml文件并将它们放入repositary。 当用户的机器上发生exception时,可以创建带有IL偏移的格式化错误消息。 然后用户通过邮件发送此消息(非常小)。 最后,可以创建一个简单的工具,从格式化的错误消息重新创建结果堆栈。 我只是想知道为什么没有其他人没有实现这样的工具? 我不相信这只对我有意义。

为什么generics类型的名称在.NET堆栈跟踪中被破坏?

我从C#方法抛出exception,它将通用列表作为参数。 private static void DoWork(List a) { } 当它抛出exception时,堆栈跟踪显示“1”而不是列表的类名。 为什么是这样? 这就是堆栈跟踪的含义。 … at DoWork(List`1 a). …

为什么在处理Action的方法中捕获会截断堆栈跟踪?

考虑这个小程序。 忽略,如果你愿意的话,通用捕获,我保持简短的尝试并说明要点: private static void Main(string[] args) { Try(Fail); } private static void Fail() { var x = ((string)null).Clone(); } private static void Try(Action action) { try { action(); } catch (Exception exc) { Debug.WriteLine(exc.StackTrace); } } 运行时,会生成以下内容(删除一些路径信息): at Scratch.Program.Fail() in Program.cs:line 27 at Scratch.Program.Try(Action action) in Program.cs:line 34 我的问题是 – 为什么exception的堆栈跟踪会在Try()方法中解除方法链的展开? 我希望它能够通过Main()方法解除它。 我还没有找到任何关于什么是停止exception展开超过Try()文档 – […]

如何从托管代码中捕获的本机exception中获取本机堆栈跟踪

我有一些托管代码调用一些本机DLL内的方法(我有适当的符号文件)。 有时,该本机方法会抛出我在托管代码中捕获的exception。 但是,当我从捕获的exception中打印堆栈跟踪时,我只看到托管代码(最后一帧是对本机代码的调用..但它没有看到本机代码中的堆栈跟踪)。 我怎样才能获得原生的callstack? *当我调试代码时,我可以进入本机代码,并查看实际调用堆栈。

StackTrace文件名未知

在我使用StackTrace的代码中发生了一些奇怪的事情。 这几乎就像没有加载调试信息一样……但是我在DEBUG构建中运行它。.pdb文件在bin目录中是最新的并且是最新的。 我已经严重失去了思想: public class TraceHelper { private static IDictionary TraceDictionary = new Dictionary(); public TraceHelper(int duration) { … TraceDictionary[InternalGetCallingLocation()]+=duration; … } public static string InternalGetCallingLocation () { var trace = new System.Diagnostics.StackTrace(); var frames = trace.GetFrames(); var filename = frames[1].GetFileName(); //<<– this always returns null return frames[0].ToString(); //this returns: // "InternalGetCallingLocation at offset 99 […]

ComboBox强制崩溃(不是我的代码)

我从下面的客户报告了堆栈跟踪。 我不知道如何重现这一点。 我的WPF应用程序有相当数量的ComboBoxes; 鉴于下面的堆栈跟踪,我不确定如何确定哪个ComboBox失败。 有没有人见过这个? 你能解释一下这个堆栈跟踪的内容吗? 有任何想法吗? System.NullReferenceException: Object reference not set to an instance of an object. at System.Windows.Controls.ComboBox.CoerceIsSelectionBoxHighlighted(Object o, Object value) at System.Windows.DependencyObject.ProcessCoerceValue(DependencyProperty dp, PropertyMetadata metadata, EntryIndex& entryIndex, Int32& targetIndex, EffectiveValueEntry& newEntry, EffectiveValueEntry& oldEntry, Object& oldValue, Object baseValue, Object controlValue, CoerceValueCallback coerceValueCallback, Boolean coerceWithDeferredReference, Boolean coerceWithCurrentValue, Boolean skipBaseValueChecks) at System.Windows.DependencyObject.UpdateEffectiveValue(EntryIndex entryIndex, DependencyProperty dp, […]

如何从StackTrace中获取参数值

在方法调用中,我需要在堆栈中“跳转”三层并检索传递给该方法的参数的类型和值。 获取参数类型很简单,但我找不到将值传递给堆栈上的某个方法的方法。 var st = new StackTrace(); var frames = st.GetFrames(); var methodParameters = frame[2].GetMethod().GetParameters; // get each parameter value 注意:使用StackTrace不是必需的。 有没有办法在运行时找到传递给方法的参数值?

exception显示开发人员的路径而不是服务器

当任何ASP.NET项目(可能是任何.net应用程序)发生exception时,堆栈跟踪将显示开发人员计算机上的路径,即使在生产中也是如此。 怎么改呢? 引擎盖下发生了什么?

如何将stacktrace行拆分为命名空间,类,方法文件和行号?

C#堆栈跟踪采用以下forms: at Foo.Core.Test.FinalMethod(Doh doh) in C:\Projects\src\Core.Tests\Test.cs:line 21 at Foo.Core.Test.AnotherMethod(Bar bar) at Foo.Core.Test.AMethod() in C:\Projects\src\Core.Tests\Test.cs:line 6 at Foo.Core.Test.c__DisplayClass7.b__6(Object _) in C:\Projects\src\Core.Tests\Test.cs:line 35 如何从每一行检索命名空间,类,方法,文件和行号? 有没有现成的课程要做? 如果不是最好的方法是什么? 正则表达式? 我如何贪婪地匹配命名空间但保留类和方法? 自定义解析器? 会欣赏一些想法和意见。

如何在不丢失堆栈跟踪的情况下重新抛出TargetInvocationException的内部exception

我有许多使用Delegate.DynamicInvoke调用的方法。 其中一些方法进行数据库调用,我希望能够捕获TargetInvocationException并且不捕获TargetInvocationException并通过其内部搜索来查找实际出错的地方。 我正在使用此方法重新抛出,但它清除了堆栈跟踪: try { return myDelegate.DynamicInvoke(args); } catch(TargetInvocationException ex) { Func getInner = null; getInner = delegate(TargetInvocationException e) { if (e.InnerException is TargetInvocationException) return getInner((TargetInvocationException) e.InnerException); return e.InnerException; }; Exception inner = getInner(ex); inner.PreserveStackTrace(); throw inner; } PreserveStackTrace方法是我修复的扩展方法,感谢另一篇文章(我不知道它实际上做了什么)。 但是,这似乎不会保留跟踪: public static void PreserveStackTrace(this Exception e) { var ctx = new StreamingContext(StreamingContextStates.CrossAppDomain); var mgr = […]