为 Android DDMS 增加 MaxJavaStackTraceDepth

Increase MaxJavaStackTraceDepth for Android DDMS

我遇到了一个很难调试的 WhosebugError,由于堆栈跟踪的深度有限,我无法找到问题的根源。

对于 Android 是否可以像 -XX:MaxJavaStackTraceDepth=1000000 那样以某种方式增加 StackTraceDepth?

我不确定它是否有趣,但这是当前的堆栈跟踪:

java.lang.RuntimeException: An error occured while executing doInBackground()
        at android.support.v4.content.ModernAsyncTask.done(ModernAsyncTask.java:137)
        at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:355)
        at java.util.concurrent.FutureTask.setException(FutureTask.java:222)
        at java.util.concurrent.FutureTask.run(FutureTask.java:242)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)
        at java.lang.Thread.run(Thread.java:841)
 Caused by: java.lang.WhosebugError
        at org.nfunk.jep.ASTFunNode.jjtAccept(Unknown Source)
        at org.nfunk.jep.SimpleNode.childrenAccept(Unknown Source)
        at org.nfunk.jep.EvaluatorVisitor.visit(Unknown Source)
        at org.nfunk.jep.ASTFunNode.jjtAccept(Unknown Source)
        at org.nfunk.jep.SimpleNode.childrenAccept(Unknown Source)
        at org.nfunk.jep.EvaluatorVisitor.visit(Unknown Source)
        at org.nfunk.jep.ASTFunNode.jjtAccept(Unknown Source)
        at org.nfunk.jep.SimpleNode.childrenAccept(Unknown Source)
        at org.nfunk.jep.EvaluatorVisitor.visit(Unknown Source)
        at org.nfunk.jep.ASTFunNode.jjtAccept(Unknown Source)
        at org.nfunk.jep.SimpleNode.childrenAccept(Unknown Source)
        at org.nfunk.jep.EvaluatorVisitor.visit(Unknown Source)
        at org.nfunk.jep.ASTFunNode.jjtAccept(Unknown Source)
        at org.nfunk.jep.SimpleNode.childrenAccept(Unknown Source)
        at org.nfunk.jep.EvaluatorVisitor.visit(Unknown Source)
        at org.nfunk.jep.ASTFunNode.jjtAccept(Unknown Source)
        at org.nfunk.jep.SimpleNode.childrenAccept(Unknown Source)
        at org.nfunk.jep.EvaluatorVisitor.visit(Unknown Source)
        at org.nfunk.jep.ASTFunNode.jjtAccept(Unknown Source)
        at org.nfunk.jep.SimpleNode.childrenAccept(Unknown Source)
        at org.nfunk.jep.EvaluatorVisitor.visit(Unknown Source)
        at org.nfunk.jep.ASTFunNode.jjtAccept(Unknown Source)
        at org.nfunk.jep.SimpleNode.childrenAccept(Unknown Source)
        at org.nfunk.jep.EvaluatorVisitor.visit(Unknown Source)
        at org.nfunk.jep.ASTFunNode.jjtAccept(Unknown Source)
        at org.nfunk.jep.SimpleNode.childrenAccept(Unknown Source)
        at org.nfunk.jep.EvaluatorVisitor.visit(Unknown Source)
        at org.nfunk.jep.ASTFunNode.jjtAccept(Unknown Source)
        at org.nfunk.jep.SimpleNode.childrenAccept(Unknown Source)
        at org.nfunk.jep.EvaluatorVisitor.visit(Unknown Source)
        at org.nfunk.jep.ASTFunNode.jjtAccept(Unknown Source)
        at org.nfunk.jep.SimpleNode.childrenAccept(Unknown Source)
        at org.nfunk.jep.EvaluatorVisitor.visit(Unknown Source)
        at org.nfunk.jep.ASTFunNode.jjtAccept(Unknown Source)
        at org.nfunk.jep.SimpleNode.childrenAccept(Unknown Source)
        at org.nfunk.jep.EvaluatorVisitor.visit(Unknown Source)
        at org.nfunk.jep.ASTFunNode.jjtAccept(Unknown Source)
        at org.nfunk.jep.SimpleNode.childrenAccept(Unknown Source)
        at org.nfunk.jep.EvaluatorVisitor.visit(Unknown Source)
        at org.nfunk.jep.ASTFunNode.jjtAccept(Unknown Source)
        at org.nfunk.jep.SimpleNode.childrenAccept(Unknown Source)
        at org.nfunk.jep.EvaluatorVisitor.visit(Unknown Source)
        at org.nfunk.jep.ASTFunNode.jjtAccept(Unknown Source)
        at org.nfunk.jep.SimpleNode.childrenAccept(Unknown Source)
        at org.nfunk.jep.EvaluatorVisitor.visit(Unknown Source)
        at org.nfunk.jep.ASTFunNode.jjtAccept(Unknown Source)
        at org.nfunk.jep.SimpleNode.childrenAccept(Unknown Source)
        at org.nfunk.jep.EvaluatorVisitor.visit(Unknown Source)
        at org.nfunk.jep.ASTFunNode.jjtAccept(Unknown Source)
        at org.nfunk.jep.SimpleNode.childrenAccept(Unknown Source)
        at org.nfunk.jep.EvaluatorVisitor.visit(Unknown Source)
        at org.nfunk.jep.ASTFunNode.jjtAccept(Unknown Source)
        at org.nfunk.jep.SimpleNode.childrenAccept(Unknown Source)
        at org.nfunk.jep.EvaluatorVisitor.visit(Unknown Source)
        at org.nfunk.jep.ASTFunNode.jjtAccept(Unknown Source)
        at org.nfunk.jep.SimpleNode.childrenAccept(Unknown Source)
        at org.nfunk.jep.EvaluatorVisitor.visit(Unknown Source)
        at org.nfunk.jep.ASTFunNode.jjtAccept(Unknown Source)
        at org.nfunk.jep.SimpleNode.chi

谢谢

输出被切断是因为日志系统的限制,而不是堆栈深度。最简单的做法是减少设备上的堆栈深度,以便它更快失败并且堆栈跟踪适合 4K 日志消息。

如果自己创建线程,可以在Thread构造函数中配置栈大小。看起来这可能是由线程池创建的,因此您需要提供一个使用 appropriate constructor.

的 ThreadFactory

有一次我为 android.util.Log 写了一个补丁,它检测到这种情况并删除了跟踪的中间部分,让你知道开始和结束,但我从来没有让它投入生产。