import 'dart:async';
import 'package:stack_trace/stack_trace.dart';
void main() {
scheduleAsync();
}
void scheduleAsync() {
new Future.delayed(new Duration(seconds: 1))
.then((_) => runAsync());
}
void runAsync() {
throw 'oh no!';
}
我得到了堆栈跟踪。我所能跟踪的最远的回调是schedueasync()
中的runasync()
调用。没有留下schedueasync
是从main
调用的信息。
Unhandled exception: Uncaught Error: oh no! Stack Trace: #0 runAsync (file:///home/myuser/dart/playground/bin/stack_trace/main.dart:14:3) #1 scheduleAsync. (file:///home/myuser/dart/playground/bin/stack_trace/main.dart:10:28) #2 _RootZone.runUnary (dart:async/zone.dart:1155) #3 _Future._propagateToListeners.handleValueCallback (dart:async/future_impl.dart:484) #4 _Future._propagateToListeners (dart:async/future_impl.dart:567) #5 _Future._complete (dart:async/future_impl.dart:348) #6 Future.Future.delayed. (dart:async/future.dart:228) #7 Timer._createTimer. (dart:async-patch/timer_patch.dart:16) #8 _Timer._runTimers (dart:isolate-patch/timer_impl.dart:385) #9 _handleMessage (dart:isolate-patch/timer_impl.dart:411) #10 _RawReceivePortImpl._handleMessage (dart:isolate-patch/isolate_patch.dart:142) #0 _rootHandleUncaughtError. (dart:async/zone.dart:886) #1 _asyncRunCallbackLoop (dart:async/schedule_microtask.dart:41) #2 _asyncRunCallback (dart:async/schedule_microtask.dart:48) #3 _runPendingImmediateCallback (dart:isolate-patch/isolate_patch.dart:96) #4 _Timer._runTimers (dart:isolate-patch/timer_impl.dart:392) #5 _handleMessage (dart:isolate-patch/timer_impl.dart:411) #6 _RawReceivePortImpl._handleMessage (dart:isolate-patch/isolate_patch.dart:142) Process finished with exit code 255
有没有一种方法可以获得完整的堆栈跟踪?
stack_trace
包https://pub.dartlang.org/packages/stack_trace将整个堆栈跟踪放在一起。
另请参见
-stack_trace包开发人员的这篇博客文章。
-http://news.dartlang.org/2016/01/unboxing-packages-stacktrace.html?m=1
import 'dart:async';
import 'package:stack_trace/stack_trace.dart';
void main() {
Chain.capture(() {
scheduleAsync(); // <= pass my code in Chain.capture
}, onError: (error, stack) {
print(error);
print(stack);
});
}
void scheduleAsync() {
new Future.delayed(new Duration(seconds: 1))
.then((_) => runAsync());
}
void runAsync() {
throw 'oh no!';
}
生成此输出,允许追溯到main
中的第一行。
oh no! main.dart 19:3 runAsync main.dart 15:28 scheduleAsync. package:stack_trace/src/stack_zone_specification.dart 134:26 registerUnaryCallback.. package:stack_trace/src/stack_zone_specification.dart 210:15 StackZoneSpecification._run package:stack_trace/src/stack_zone_specification.dart 134:18 registerUnaryCallback. dart:async/zone.dart 902 _rootRunUnary dart:async/zone.dart 804 _CustomZone.runUnary dart:async/future_impl.dart 484 _Future._propagateToListeners.handleValueCallback dart:async/future_impl.dart 567 _Future._propagateToListeners dart:async/future_impl.dart 348 _Future._complete dart:async/future.dart 228 Future.Future.delayed. package:stack_trace/src/stack_zone_specification.dart 210:15 StackZoneSpecification._run package:stack_trace/src/stack_zone_specification.dart 124:52 registerCallback. dart:async/zone.dart 891 _rootRun dart:async/zone.dart 796 _CustomZone.run dart:async/zone.dart 704 _CustomZone.runGuarded dart:async/zone.dart 729 _CustomZone.bindCallback. package:stack_trace/src/stack_zone_specification.dart 210:15 StackZoneSpecification._run package:stack_trace/src/stack_zone_specification.dart 124:52 registerCallback. dart:async/zone.dart 895 _rootRun dart:async/zone.dart 796 _CustomZone.run dart:async/zone.dart 704 _CustomZone.runGuarded dart:async/zone.dart 729 _CustomZone.bindCallback. dart:async-patch/timer_patch.dart 16 Timer._createTimer. dart:isolate-patch/timer_impl.dart 385 _Timer._runTimers dart:isolate-patch/timer_impl.dart 411 _handleMessage dart:isolate-patch/isolate_patch.dart 142 _RawReceivePortImpl._handleMessage ===== asynchronous gap =========================== dart:async/zone.dart 828 _CustomZone.registerUnaryCallback dart:async/future_impl.dart 208 _Future.then main.dart 15:12 scheduleAsync main.dart 6:18 main. package:stack_trace/src/chain.dart 82:24 Chain.capture. dart:async/zone.dart 895 _rootRun dart:async/zone.dart 796 _CustomZone.run dart:async/zone.dart 1251 runZoned package:stack_trace/src/chain.dart 80:20 Chain.capture main.dart 5:16 main dart:isolate-patch/isolate_patch.dart 255 _startIsolate. dart:isolate-patch/isolate_patch.dart 142 _RawReceivePortImpl._handleMessage Process finished with exit code 0
import 'dart:async';
import 'package:stack_trace/stack_trace.dart';
void main() {
Chain.capture(() {
scheduleAsync();
}, onError: (error, stack) {
print(error);
print(new Trace.from(stack).terse);
});
}
void scheduleAsync() {
new Future.delayed(new Duration(seconds: 1))
.then((_) => runAsync());
}
void runAsync() {
throw 'oh no!';
}
oh no! main.dart 19:3 runAsync main.dart 15:28 scheduleAsync. ===== asynchronous gap =========================== dart:async _Future.then main.dart 15:12 scheduleAsync main.dart 6:18 main. package:stack_trace Chain.capture main.dart 5:16 main Process finished with exit code 0
问题内容: 更新 :Intellij IDEA的最新版本完全实现了我想要的功能。问题是如何在IDE外部实现此功能(以便我可以将异步堆栈跟踪信息转储到日志文件中),理想情况下无需使用检测代理。 自从我将应用程序从同步模型转换为异步模型以来,调试故障一直遇到问题。 当我使用同步API时,我总是在异常stacktraces中找到我的类,因此我知道从哪里开始寻找问题。使用异步API,我得到的堆栈跟踪既不引
问题内容: Java的e.printStackTrace()不会打印内部异常的堆栈跟踪的所有详细信息。 有没有现成的方法来生成字符串形式的完整堆栈跟踪?(除了自己格式化外) 编辑 我刚刚发现printStackTrace()的作用-显然,它过滤掉的堆栈帧正是内部异常和外部异常共同的帧。因此,实际上这是我想要的,而不是“完整”堆栈跟踪。 问题答案: 我最终滚动了自己的代码(我采用了Throwable
问题内容: 我确实有一个jenkins实例,它陷入了某种无休止的循环,没有任何可见的活动。 我可以获得正在运行的进程的信息,那么如何生成可用于错误报告的跟踪? 我在linux上运行。 问题答案: 尝试使用jstack。它会为您提供线程正在执行的操作的完整列表。它所需要的只是进程pid。
问题内容: 最近,我问是否要报告捕获到的异常的文本。出乎意料的是,大多数答案都误解了我的问题,并以为我在问是否要报告堆栈跟踪以获取捕获的异常,这表明这样做是正常的。所以我要问一个后续问题。 在例外情况下,应该或不应该在什么情况下报告堆栈跟踪?通过“报告”,我包括要求一个日志记录框架为您记录堆栈跟踪 我不问是否报告 的东西 。我在问那个报告是否应该包括堆栈跟踪。 问题答案: 它取决于上下文。例如,当
问题内容: 如何获得Java中的当前堆栈跟踪,就像你可以在.NET中那样? 我找到了,但这不是我想要的-我想找回堆栈跟踪信息,而不是打印出来。 问题答案: 你可以使用。 这将返回一个数组,该数组代表程序的当前堆栈跟踪。
在我们的日志文件中,我们发现以下内容: 只有这一行,没有异常堆栈跟踪。 出现此异常的try块正在执行使用javassist创建的动态生成的Java字节码。 我想知道两件事: : null 丢失的堆栈跟踪,尽管在块内使用调用日志挂钩,这通常会导致完整的堆栈跟踪被打印在日志文件中。 我的问题: > 什么样的代码会导致日志输出“java.lang.ArrayIndexOutOfBoundsExcepti