调试这个的好策略是什么?

时间:2015-07-31 21:39:07

标签: android eclipse android-activity android-debugging

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

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

  

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

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

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

7 个答案:

答案 0 :(得分:10)

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

How do I prevent exception catching in Android?

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

关于使用详细等的说明 此外,我个人只是在开始调试时专注于错误。我觉得它更容易阅读。在开始查看警告之前,我从logcat中删除了所有错误。同样详细,如果程序运行不正常,logcat可能无法跟上。

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

祝你好运。

答案 1 :(得分:6)

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

你可能做的是将一些错误的参数传递给某些系统方法,或者只是你有一些特定于平台的错误。我不能仅根据您的logcat说出该方法是什么。

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

答案 2 :(得分:1)

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

答案 3 :(得分:1)

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

答案 4 :(得分:1)

onCreate() ActivityClientRecord的代码块是什么?

  1. 您应该设置几个断点。首先在调用startActivity()的地方然后在目标活动的onCreate()的第一个语句上。然后你应该逐条陈述以找出确切的原因。
  2. 如果您仍然无法找到问题点,请抓住Error而不是Exception包裹startActivity(),然后告诉我们您是否可以看到任何有用的信息。

答案 5 :(得分: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();
        }
    });
}

}

答案 6 :(得分:1)

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

  1. Increase the Log Buffer size - 有时候,Logcat中发生了太多事情,你正在寻找的堆栈跟踪已被清除。 (对于Android Studio,it's a little different
  2. Apply a filter using your app name - 这会从其他应用中删除所有混乱的日志。如果仍然没有运气,请回到“无过滤器”并继续执行步骤3.
  3. 搜索“关闭”或“退出线程” - 在崩溃情形中,根本原因显示在这些单词周围。
  4. 使用断点缩小有问题的代码。有很多方法可以做到这一点,但我更喜欢在任何“重大事件”(OnCreate,Service,Calls,Catch Exception等)上设置一个断点并贯穿每一个,直到找到一个永远不会达到的重大事件,但是是。然后我每次调整断点多一点以缩小它。
  5. 额外注意附近的Threads / Runnables,因为这些通常是神秘错误(无限循环,死锁等)的罪魁祸首。如果必须,在run()方法的每一行放置一个断点,并查看它挂起/失败的位置。