了解堆栈跟踪 [重复]

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 也许运行代码与源代码不匹配,并且您无法用您拥有的源代码重现问题,这意味着源代码不同,因为问题有已经修复

以上是关于了解堆栈跟踪 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

在进行 HTTP 调用时显示以下堆栈跟踪 [重复]

在程序中的任何位置生成 Java 堆栈跟踪 [重复]

我使用 id 作为标识符来查找元素,但异常堆栈跟踪显示 css 选择器 [重复]

堆栈跟踪中没有函数名称,GDB,但出现在LLDB中[重复]

跟踪填写表单重复信息

C ++:堆栈的 push() 与 emplace() [重复]