问题标签 [stack-trace]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
java - 有没有办法在不抛出异常的情况下转储堆栈跟踪?
我正在考虑为我的 Java 应用程序创建一个调试工具。
我想知道是否可以获得堆栈跟踪,就像Exception.printStackTrace()
但实际上没有抛出异常一样?
我的目标是,在任何给定的方法中,转储堆栈以查看方法调用者是谁。
.net - 如何在 Visual Studio 中找到堆栈跟踪?
我问是因为我在调试发生的异常时在 Visual Studio 中找不到堆栈跟踪。
perl - Perl:$SIG{__DIE__}、eval { } 和堆栈跟踪
我有一段类似于以下的 Perl 代码(非常简化): 有一些级别的嵌套子例程调用(实际上是方法),一些内部的调用自己的异常处理:
现在我想更改该代码,使其执行以下操作:
为每个“冒泡”到最外层 (
sub outer
) 的异常打印完整的堆栈跟踪。具体来说,堆栈跟踪不应停止在“eval { }
”的第一级。不必更改任何内部级别的执行。
现在,我这样做的方法是在sub中安装一个本地化__DIE__
处理程序:outer
[编辑:我犯了一个错误,上面的代码实际上并没有按照我想要的方式工作,它实际上绕过了middle
sub 的异常处理。所以我想问题应该是:我想要的行为是否可能?]
这完美地工作,唯一的问题是,如果我正确理解文档,它依赖于明确弃用的行为,即__DIE__
处理程序被触发的事实,即使是 " die
"s 内部的 " eval { }
"s,他们真的不应该这样做。两者都perlvar
声明perlsub
这种行为可能会在 Perl 的未来版本中被删除。
有没有另一种方法可以在不依赖已弃用的行为的情况下实现这一目标,或者即使文档另有说明也可以节省依赖?
c - HP-UX 和 Linux 上的堆栈展开
我需要在某些点获取我的 C 应用程序的堆栈信息。我已经阅读了文档并搜索了网络,但仍然无法弄清楚我该怎么做。你能指出一个简单的过程解释吗?或者,甚至更好的是堆栈展开的示例。我需要它用于 HP-UX (Itanium) 和 Linux。
python - 为了实现尾调用优化,jvm 必须牺牲什么?
人们说除了没有尾调用优化的限制之外,clojure 实现非常出色 - jvm 的限制而不是 clojure 实现。
http://lambda-the-ultimate.org/node/2547
据说在 Python 中实现 TCO 会牺牲
- 堆栈跟踪转储,以及
- 调试规律。
向我解释尾调用优化有什么大不了的,为什么 Python 需要它
是否必须为 TCO 的 jvm 实现做出同样的牺牲?还要牺牲什么吗?
c# - 如何在保持到目前为止生成的堆栈跟踪的同时重新引发内部异常?
重复:在 C# 中,如何在不丢失堆栈跟踪的情况下重新抛出 InnerException?
我有一些在后台线程上异步调用的操作。有时,事情会变糟。发生这种情况时,我往往会得到一个 TargetInvocationException,虽然合适,但它却毫无用处。我真正需要的是 TargetInvocationException 的 InnerException,如下所示:
这样,我的调用者就会收到发生的 REAL 异常。问题是,throw 语句似乎重置了堆栈跟踪。我想基本上重新抛出内部异常,但保留它原来的堆栈跟踪。我怎么做?
澄清: 我只想要内部异常的原因是这个类试图“抽象掉”这些函数(由调用者提供的委托)在其他线程上运行的整个事实等等。如果有异常,那么很可能它与在后台线程上运行无关,调用者真的希望堆栈跟踪进入他们的委托并找到真正的问题,而不是我的调用调用。
c# - 使用.net 中用户错误报告中的行号重新创建堆栈跟踪?
首先,问题: 我有几个免费项目,并且与任何软件一样,它们都包含错误。遇到错误时,一些其他用户会向我发送带有堆栈跟踪的错误报告。为了简化查找故障位置,我想查看此堆栈跟踪中的行号。如果应用程序没有 .pdb 文件,那么所有行信息都会丢失,所以目前我所有的项目都部署了 .pdb 文件,因此生成的堆栈跟踪有这个数字。但!但我不想在分发中看到这些文件,并且想删除所有 .pdb。它们使用户感到困惑,在安装程序中占用空间等。
Delphi 解决方案: 很久以前,当我还是一名 Delphi 程序员时,我使用了以下技术:在异常时,我的应用程序在堆栈上行走并收集地址。然后,当我收到错误报告时,我使用了一个工具,该工具根据收集的地址和位于我机器上的相应符号文件,使用函数名称和行号重建有效堆栈跟踪。
问题: .NET 中是否有任何库、技术或任何可以做同样事情的东西?
状态更新:非常有趣,经常提问是开始自己调查的最佳方式。例如,我考虑了这个问题一段时间,但几天前才开始寻找答案。
选项 1:小型转储。经过大量谷歌搜索后,我找到了一种从代码创建迷你转储的方法,以及如何从托管迷你转储重新创建堆栈。
- 可再发行程序集创建迷你转储表单代码 - clrdump
- 关于使用以前的程序集的博客文章 -在 .NET 生产应用程序中创建和分析小型转储
然而,这个解决方案需要重新分配两个额外的程序集(大约 1mb 大小),并且迷你转储需要一些空间,并且用户通过电子邮件发送它们很不舒服。所以就我的目的而言,现在,这是不可接受的。
选项 2:感谢 weiqure 提供线索。可以为每个堆栈帧提取托管 IL 偏移量。现在的问题是如何根据这个偏移量从 .pdb 中获取行号。我发现了什么:
- PDB File Internals,仅供参考,因为:
- ISymbolReader - 用于读取程序数据库文件的托管接口
- 最后是一个将 .pdb 文件转换为结构化 xml以便于 xpath 处理的工具
使用此工具,可以为每个发布版本创建 xml 文件并将它们放入存储库。当用户机器上发生异常时,可以创建带有 IL 偏移量的格式化错误消息。然后用户通过邮件发送此消息(非常小)。最后,可以创建一个简单的工具,从格式化的错误消息重新创建结果堆栈。
我只是想知道为什么没有人不实现这样的工具?我不相信这只是对我感兴趣。
java - 在 printStackTrace() 上打印完整的调用堆栈?
我需要编写一个小型日志分析器应用程序来处理由我的项目中使用的第 3 方封闭源库(内部有自定义记录器)生成的一些日志文件。
如果日志中出现异常条目,我需要收集有关从顶部到异常实际位置的堆栈跟踪所涉及的方法的聚合信息。
不幸的是,默认情况下,Java printStackTrace() 不会打印调用堆栈中的每个方法,而是打印到一定数量,其余的只是引用为16 more...
.
如果我可以自己捕获异常,我会使用 getStackTrace() 并自己打印它,但根本原因永远不会包含在这个库抛出的异常中。
有没有办法让 Java 在堆栈跟踪中打印整个调用堆栈?
除了我的情况之外,常见的日志记录框架是否有此选项?
编辑:该程序在带有 JDK 1.5.0_09 的 Sun JVM 上运行。没有选择改变它。
.net - 如何在 .NET 中记录应用程序的整个堆栈跟踪
我刚刚开始处理现有的.NET应用程序,其中包含大约 40 个活动项目。在熟悉项目的同时,我发现自己不断地通过应用程序来学习结构和逻辑流程。如果我可以让应用程序运行并记录每个方法调用并在之后查看日志,这将使这个过程变得更加容易。我知道我可以添加Debug.WriteLine
orTrace.WriteLine
语句,但是将这些语句添加到 40 个项目中的大多数方法中听起来有点矫枉过正。这种方法有什么好的替代方法吗?
CLR Profiler向我介绍了适当的关键字“调用图”,这让我想到了一个重复的问题,如何查看 .NET 程序的动态调用图的可视化?.
stack-trace - 如何在 Java 中获取当前堆栈跟踪?
我如何在 Java 中获取当前堆栈跟踪,就像在 .NET 中你可以做的那样Environment.StackTrace
?
我找到Thread.dumpStack()
了,但这不是我想要的——我想取回堆栈跟踪,而不是打印出来。