调试Async任务时,Android Studio中的调试器行为很奇怪

时间:2016-02-16 04:50:12

标签: java android debugging android-studio breakpoints

我一直在尝试使用Android Studio断点来调试我的代码,但它们给了我非常奇怪的行为。例如,我正在尝试调试以下代码段:

new AsyncTask<Void, Void, Exception>() {
    @Override
    protected Exception doInBackground(Void... params) {
        try {
            Assets assets = new Assets(MainActivity.this);
            File assetDir = assets.syncAssets();
            setupRecognizer(assetDir);
        } catch (IOException e) {
            return e;
        }
        return null;
    }

    @Override
    protected void onPostExecute(Exception result) {
        if (result != null) {
            ((TextView) findViewById(R.id.textView))
                    .setText("Failed to init recognizer " + result);
        } else {
            switchSearch(KWS_SEARCH);
        }
    }
}.execute();

我在行上放了一个断点

Assets assets = new Assets(MainActivity.this);

然后我说“踏入”。这将我带到一个“反编译的类文件”和以下代码片段:

public Assets(Context context) throws IOException {
    File appDir = context.getExternalFilesDir((String)null);
    if(null == appDir) {
        throw new IOException("cannot get external files dir, external storage state is " + Environment.getExternalStorageState());
    } else {
        this.externalDir = new File(appDir, "sync");
        this.assetManager = context.getAssets();
    }
}

这完全是预期和合理的。在此之后,我尝试进入行

File appDir = context.getExternalFilesDir((String)null);

然后事情变得非常奇怪。首先,我进入一个新文件,在两个方法之间的空白行。当我尝试进入空白行时,我会被反弹到另一个文件,其中执行已在另一个方法的结束大括号中停止。然后我进入那个大括号,我被带到另一个文件中两个方法之间的另一个空白行。当我进入那个时,我会被带到下一行,这只是一个@override注释。单步执行将我带到另一个文件中的if语句的结束大括号。

这种奇怪的行为一直在继续,我无法理解它。有时,调试器甚至似乎在评论中间暂停执行!这怎么可能呢?有谁知道为什么会这样?它是否与我正在调试AsyncTask的事实有关?

(请注意,我已经重复了四次调试过程并且每次都出现了相同的奇怪行为)

1 个答案:

答案 0 :(得分:4)

在Debug中不是问题。当空白空间或注释中的调试暂停时,原始源代码类和提供的源未同步或不是同一版本。

修改

让我用一个例子来解释你。你有第三方库xxx-1.1.jar,你想调试这个库的代码,所以你用google搜索这个jar的源xxx-1.1-source.jar。但由于某些原因,xxx-1.1-source.jar的开发人员在创建xxx-1.1.jar后2小时打包了这个源代码,并且他在某些类的开头添加了一些你要调试的注释,所以此时调试xxx -1.1.jar使用xxx-1.1-source.jar提供的代码,源代码不完全匹配。

希望它有所帮助!