11

在 Eclipse 上用 Java 开发的 Android (4.2.2) 应用程序,我遇到了崩溃,但我无法弄清楚我的代码中是什么导致了它。. .

堆栈跟踪没有引用我自己的任何源代码。. .

线程 [<1> main] (Suspended (exception RuntimeException))
ActivityThread.performLaunchActivity(ActivityThread$ActivityClientRecord, Intent) line: 2255
ActivityThread.handleLaunchActivity(ActivityThread$ActivityClientRecord, Intent) line: 2309 ActivityThread.access$700(ActivityThread, ActivityThread$ActivityClientRecord , Intent) 行:157
ActivityThread$H.handleMessage(Message) 行:1289
ActivityThread$H(Handler).dispatchMessage(Message) 行:99 Looper.loop() 行:176 ActivityThread.main(String[]) 行:5317
Method.invokeNative(Object, Object[], Class, Class[], Class, int, boolean) 行:不可用 [native method] Method.invoke(Object, Object...) 行:511 ZygoteInit$MethodAndArgsCaller.run( ) 行:1102 ZygoteInit.main(String[]) 行:869 NativeStart.main(String[]) 行:不可用 [本机方法]

...我在我的应用程序中启动了几个活动,所有活动都包含在 try/catch 中,但是如果我在 catch 块中设置断点,它们不会被击中,并且如果我跳过启动活动的代码,似乎什么也没有不对劲。系统也没有向 Logcat 写入任何指示任何异常的内容(Logcat 上没有过滤器,完整的 Verbose 输出)。

单击上面的行只会给我“找不到源”。有没有办法查看它试图启动的 Activity 或异常的性质是什么?

4

7 回答 7

10

在研究了这个之后,我在这里看到了这个问题的答案:

如何防止在 Android 中捕获异常?

这建议继续执行代码,直到您在 logcat 中获得与您的代码相关的信息。

只是关于使用详细等的说明。
另外,我个人在开始调试时只关注错误。我发现它更容易阅读。在开始查看警告之前,我从 logcat 中删除了所有错误。还有详细的情况,如果程序真的运行不好,logcat 可能无法跟上。

这是我个人的调试风格,绝不是法律。

祝你好运。

于 2015-08-03T16:58:04.790 回答
6

首先 - try/catch 不是获得防弹应用程序的最佳方式 - 通常大量这样的块意味着作者正在隐藏错误。

您可能所做的是将一些错误的参数传递给某些系统方法,或者只是您遇到了一些特定于平台的错误。我不能说仅基于您的 logcat 的方法是什么。

如何找到错误?可能最有效的方法是设置一些日志消息/断点并逐行调试,只要您再次收到此错误即可。然后在必要时返回此处提供更多详细信息。

于 2015-08-03T17:14:37.433 回答
1

根据我的经验,我在查找导致崩溃的代码时遇到了类似的问题。在这种情况下,我通常会这样做:

  1. 增加日志缓冲区大小- 有时,Logcat 中发生了太多事情,而您正在寻找的堆栈跟踪已被清除。(对于 Android Studio,有点不同
  2. 使用您的应用名称应用过滤器- 这会从其他应用中删除所有杂乱的日志。如果仍然没有运气,请设置回“无过滤器”并继续执行第 3 步。
  3. 搜索“Shutting down”或“Thread exiting”——在崩溃场景中,根本原因显示在这些词周围。
  4. 使用断点缩小有问题的代码。有很多方法可以做到这一点,但我更喜欢在任何“重大事件”(OnCreate、Service、Calls、Catch Exception 等)上设置一个断点并运行每一个,直到我找到一个从未到达的重大事件,但应该是。然后我每次多调整一点断点,以进一步缩小范围。
  5. 对附近的 Threads/Runnables 给予额外的关注,因为它们通常是神秘错误(无限循环、死锁等)的罪魁祸首。如果必须,请在 run() 方法的每一行放置一个断点,并查看它挂起/失败的位置。
于 2015-08-03T18:04:08.210 回答
1

尝试在您的 Application 类中添加以下代码:

public class App extends Application {

@Override
public void onCreate() {
    super.onCreate();
    Thread.setDefaultUncaughtExceptionHandler(new Thread.UncaughtExceptionHandler() {
        @Override
        public void uncaughtException(Thread thread, Throwable ex) {
            ex.printStackTrace();
        }
    });
}

}

于 2015-08-03T17:57:06.043 回答
1

尝试在 IDE 的调试器中以调试模式运行。它通常会捕获您的异常。您可能必须单击不同的线程来查看每个线程发生了什么。

于 2015-08-01T02:38:54.300 回答
1

你确定版本4.2.2正确吗?ActivityThread.java的AOSP 代码4.2.2除了第 2255 行所有标签的注释外没有显示任何内容。如果没有其他事情可做,如果我处于这种情况,我会深入研究 AOSP 代码,看看它是否提供了关于哪里出了问题的任何线索。

于 2015-08-03T17:22:52.950 回答
1

的代码块是onCreate()什么ActivityClientRecord

  1. 您应该设置几个断点。首先在调用的地方,startActivity()然后在目标活动的 onCreate() 的第一条语句上。然后你应该逐个声明找出确切原因。

如果您仍然找不到问题点,那么请Error不要Exception包装startActivity(),如果您能看到任何有用的信息,请告诉我们。

于 2015-08-03T17:27:53.913 回答