调试这个的好策略?

Good strategy to debug this?

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

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

Thread [<1> main] (Suspended (exception RuntimeException))
ActivityThread.performLaunchActivity(ActivityThread$ActivityClientRecord, Intent) line: 2255
ActivityThread.handleLaunchActivity(ActivityThread$ActivityClientRecord, Intent) line: 2309 ActivityThread.access0(ActivityThread, ActivityThread$ActivityClientRecord, Intent) line: 157
ActivityThread$H.handleMessage(Message) line: 1289
ActivityThread$H(Handler).dispatchMessage(Message) line: 99 Looper.loop() line: 176 ActivityThread.main(String[]) line: 5317
Method.invokeNative(Object, Object[], Class, Class[], Class, int, boolean) line: not available [native method] Method.invoke(Object, Object...) line: 511 ZygoteInit$MethodAndArgsCaller.run() line: 1102 ZygoteInit.main(String[]) line: 869 NativeStart.main(String[]) line: not available [native method]

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

点击上面的行只会给我 "source not found"。有没有办法查看 Activity 它试图启动什么或异常的性质是什么?

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

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

How do I prevent exception catching in Android?

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

关于使用 verbose 等的注意事项
此外,我个人在开始调试时只关注错误。我发现它更容易阅读。在开始查看警告之前,我删除了 logcat 中的所有错误。同样冗长,如果程序真的不是 运行 好,logcat 可能很难跟上。

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

祝你好运。

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

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

说那个方法是什么

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

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

ActivityClientRecordonCreate()的代码块是什么?

  1. 你应该设置几个断点。首先在调用 startActivity() 的地方,然后在目标 activity 的 onCreate() 的第一条语句上。那你应该逐条去查明具体原因。

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

尝试在您的应用程序中添加 class 以下代码:

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();
        }
    });
}

}

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

  1. Increase the Log Buffer size - Sometimes, too many things happen in the Logcat and the stacktrace you're looking for has already been cleared. (For Android Studio, it's a little different)
  2. Apply a filter using your app name - 这会从其他应用程序中删除所有杂乱无章的日志。如果还是不行,返回 'No Filters' 并继续第 3 步。
  3. 搜索 "Shutting down" 或 "Thread exiting"- 在崩溃情况下,根本原因会显示在这些词周围。
  4. 使用断点缩小有问题的代码范围。有很多方法可以做到这一点,但我更喜欢在任何 "major event"(OnCreate、Service、Calls、Catch Exception 等)和 运行 上设置一个断点,直到我找到一个重大事件从未达到,但应该是。然后我每次都稍微调整断点以缩小范围。
  5. 特别注意附近的 Threads/Runnables,因为它们通常是神秘错误(无限循环、死锁等)的罪魁祸首。如果需要,请在 运行() 方法的每一行放置一个断点,然后查看断点 hangs/fails.