如何在运行时android中获取堆栈跟踪

时间:2016-08-05 09:35:57

标签: android trace

我的应用不符合我的预期。设备进入休眠状态(黑屏)并打开后,设备会显示我的应用程序的屏幕,但稍后屏幕的一部分会消失 - 工具栏下方的选项卡式viewpager。

我在应用程序执行任何操作的最后一点设置了一个断点,屏幕仍然很好,所以这是系统正在做的事情,但我不知道是什么。

是否有办法打开堆栈跟踪,以便记录系统从该点开始使用的非常方法,这可能会让我找出选项卡式viewpager消失的原因?

我应该提到应用程序仍然正常运行,我可以从工具栏中打开导航抽屉并使用它的所有功能但我再也看不到选项卡式viewpager,直到我重新创建它。

4 个答案:

答案 0 :(得分:1)

Android Studio包含一个调试器,可让您调试在Android模拟器或连接的Android设备上运行的应用。使用Android Studio调试器,您可以:

选择要调试应用的设备。 在代码中设置断点。 在运行时检查变量并计算表达式。

有关详细信息,请访问https://developer.android.com/studio/debug/index.html

答案 1 :(得分:1)

您可以随时记录堆栈跟踪,而不会丢失任何内容或以其他方式中断程序。

Log.d("DERP", "check out my stack trace", new RuntimeException());

答案 2 :(得分:1)

如果您能够正确收回日志,则很可能问题可能会得到解决。正如其他人提到的,logcat是一个不错的选择。

精炼的解决方案可以是一个高效的记录器系统,它将捕获所有日志。您可以将这些文件写入本地文件以供将来参考。

JakeWharton's Hugo 是一个非常棒的库,您只需要使用注释@DebugLog进行少量修改。这将捕获您的应用程序日志并在logcat中打印。

您的bundle.gradle (Module:app)应修改如下

apply plugin: 'com.android.application'
apply plugin: 'hugo'
android {
    compileSdkVersion 24
    buildToolsVersion "23.0.3"
    ....... Other configurations

bundle.gradle (Project)这些应该存在

buildscript {
    repositories {
        jcenter()
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:2.1.2'
        classpath 'com.jakewharton.hugo:hugo-plugin:1.2.1'
    }
}

为了使hugo跟踪您的应用程序日志,需要添加@DebugLog。例如,在您的类方法中。您可以在hugo sample

中找到

现在为了获取日志,请执行以下操作。

  

以下代码不需要对hugo库做任何事情,它   将只从logcat捕获日志。

Inside和AsyncTask执行以下操作并将内容写入文件并验证它们。

        @Override
        protected String doInBackground(Void... voids) {
            String responseString = null;

                try {

                    Process process = Runtime.getRuntime().exec("logcat -b main -d");
                    BufferedReader bufferedReader = new BufferedReader(
                            new InputStreamReader(process.getInputStream()));
                    String line;
                    StringBuilder log=new StringBuilder();
                    while ((line = bufferedReader.readLine()) != null) {

                            log.append(line);
                            log.append('\n');
                            log.append("-----------");
                    }
                    responseString = log.toString();

                } catch (Exception e) {
                }
            return responseString;
        }

它可能看起来很复杂,但请相信我,它的方式比其他库好,并简化了开发人员的工作。

您也可以尝试使用Runtime.getRuntime().exec("logcat -d");

祝你好运,试一试。 !!

答案 3 :(得分:-1)

有两件事是可能的。首先是你在onResume(一些网络命中和/或ui更新)中做了一些事情。第二个是重新创建的活动。因此,您可以使用“不保持活动”选项来测试应用程序。它将帮助您确定确切的问题。