了解堆栈跟踪 [重复]
Posted
技术标签:
【中文标题】了解堆栈跟踪 [重复]【英文标题】:Understanding Stack Trace [duplicate] 【发布时间】:2021-08-21 04:56:00 【问题描述】:我对字符串字面量未初始化的变量 html 有疑问。运行版本和跟踪匹配的第 95 行是注释。
公共类 WebviewActivity 扩展 AppCompatActivity
String html;
@Override
protected void onCreate(Bundle savedInstanceState)
super.onCreate(savedInstanceState);
@Override
protected void onResume()
super.onResume();
generateChart();
private void generateChart()
html = "<!DOCTYPE html>";
html += "<head>";
...
无法完全理解这次崩溃。 在 NDK lib generateChart 和 webview 活动中定义了一个方法,该方法也具有相同的名称但具有不同的签名。通过 ndk 包装器在 webview 中调用 Native 方法。我对崩溃线 Method.Invoke(Native method) 感到困惑 这是由于本机方法还是 Java 方法导致的崩溃? 以及如何模拟这个错误来调试。
java.lang.RuntimeException:
at android.app.ActivityThread.performResumeActivity (ActivityThread.java:4330)
at android.app.ActivityThread.handleResumeActivity (ActivityThread.java:4362)
at android.app.servertransaction.ResumeActivityItem.execute (ResumeActivityItem.java:52)
at android.app.servertransaction.TransactionExecutor.executeLifecycleState (TransactionExecutor.java:176)
at android.app.servertransaction.TransactionExecutor.execute (TransactionExecutor.java:97)
at android.app.ActivityThread$H.handleMessage (ActivityThread.java:2128)
at android.os.Handler.dispatchMessage (Handler.java:107)
at android.os.Looper.loop (Looper.java:214)
at android.app.ActivityThread.main (ActivityThread.java:7711)
at java.lang.reflect.Method.invoke (Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run (RuntimeInit.java:516)
at com.android.internal.os.ZygoteInit.main (ZygoteInit.java:950)
Caused by: java.lang.NullPointerException:
at in.multinetsystems.vedicastro.util.WebviewActivity.generateChart (WebviewActivity.java:95)
at in.multinetsystems.vedicastro.util.WebviewActivity.onResume (WebviewActivity.java:37)
at android.app.Instrumentation.callActivityOnResume (Instrumentation.java:1567)
at android.app.Activity.performResume (Activity.java:7989)
at android.app.ActivityThread.performResumeActivity (ActivityThread.java:4320)
at android.app.ActivityThread.handleResumeActivity (ActivityThread.java:4362)
at android.app.servertransaction.ResumeActivityItem.execute (ResumeActivityItem.java:52)
at android.app.servertransaction.TransactionExecutor.executeLifecycleState (TransactionExecutor.java:176)
at android.app.servertransaction.TransactionExecutor.execute (TransactionExecutor.java:97)
at android.app.ActivityThread$H.handleMessage (ActivityThread.java:2128)
at android.os.Handler.dispatchMessage (Handler.java:107)
at android.os.Looper.loop (Looper.java:214)
at android.app.ActivityThread.main (ActivityThread.java:7711)
at java.lang.reflect.Method.invoke (Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run (RuntimeInit.java:516)
at com.android.internal.os.ZygoteInit.main (ZygoteInit.java:950)
谢谢
【问题讨论】:
你明白文件WebviewActivity.java
中的第95 行正在抛出NullPointerException
吗?该行在方法 generateChart
中。
其实这些行号都是cmets。在安卓工作室。我认为跟踪行号与实际文件不匹配。
行号不匹配的唯一方法是编译后更改了源代码。重复。
“我对崩溃行 Method.Invoke(Native method) 感到困惑,这是由于本地方法还是 Java 方法导致的崩溃?” - 极不可能。 “以及如何模拟此错误以进行调试。” - 抱歉,我们无法为您提供帮助。
对于涉及generateChart()
中的html
变量的NPE,我能想到的唯一可能解释是,有另一个线程在更新html
,而这个线程是试图做到这一点。如果这是问题所在,那么它可能难以重现。 (但是,这个理论是基于有限的代码 + 您向我们展示的其他信息,问题必须出在您没有向我们展示的代码中。)
【参考方案1】:
一般来说,在查看堆栈跟踪时,请查找 last “Caused by”,然后查看下面的“at”行以查找提到的 first 行你的代码。
在这种情况下,即:
Caused by: java.lang.NullPointerException:
at in.multinetsystems.vedicastro.util.WebviewActivity.generateChart (WebviewActivity.java:95)
这表明WebviewActivity.java
的第 95 行中的代码在方法 generateChart
中导致了 NullPointerException
。
现在您只需要查看该行并找出哪个参考值可以是null
,但无论如何都会使用,然后回溯代码以找出它为什么是null
以及为什么您没有检查那个。
【讨论】:
实际上这行号 95 是文件中的注释,在 android studio 中。我认为跟踪行号与实际文件不匹配 @DKManchanda 那么运行代码不是来自那个源文件,而是来自更早(或更高)版本的源代码。 而且我无法在模拟器或设备上重现此崩溃。我尝试切换到主页以恢复等。在我的设备上它工作正常。 嗯......我们无能为力帮助您。您遇到了无法重现的错误,与堆栈跟踪不匹配的源代码......并且您没有共享任何源代码。我认为你要弄清楚这个烂摊子。我建议从在您的版本控制中为堆栈跟踪找到正确的源代码开始......并修复您的“流程”,以便始终将错误报告与您的源代码的特定版本联系起来。 @DKManchanda 也许运行代码与源代码不匹配,并且您无法用您拥有的源代码重现问题,这意味着源代码不同,因为问题有已经修复。以上是关于了解堆栈跟踪 [重复]的主要内容,如果未能解决你的问题,请参考以下文章