调试异步任务时 Android studio 中的奇怪调试器行为
Strange debugger behaviour in Android studio when debugging an Async task
我一直在尝试使用 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);
然后我说 "Step into"。这将我带到 "decompiled class file" 和以下代码片段:
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有关系吗?
(请注意,我已将此调试过程重复四次,每次都出现相同的奇怪行为)
在调试中不是问题。 Debug pause in blank space or comment 只是原始源码 class 和提供的源码不同步或版本不一样。
编辑:
让我用一个例子来解释你。你有一个第三方库 xxx-1.1.jar,你想调试这个库的内部代码,所以你用谷歌搜索并找到了这个 jar 的源代码 xxx-1.1-source.jar。但出于某种原因,xxx-1.1-source.jar 的开发人员在创建 xxx-1.1.jar 后 2 小时打包了此源,他在一些 class 的开头添加了一些注释调试所以,此时当您使用 xxx-1.1-source.jar 提供的代码调试 xxx-1.1.jar 时,源代码不完全匹配。
希望对您有所帮助!
我一直在尝试使用 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);
然后我说 "Step into"。这将我带到 "decompiled class file" 和以下代码片段:
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有关系吗?
(请注意,我已将此调试过程重复四次,每次都出现相同的奇怪行为)
在调试中不是问题。 Debug pause in blank space or comment 只是原始源码 class 和提供的源码不同步或版本不一样。
编辑:
让我用一个例子来解释你。你有一个第三方库 xxx-1.1.jar,你想调试这个库的内部代码,所以你用谷歌搜索并找到了这个 jar 的源代码 xxx-1.1-source.jar。但出于某种原因,xxx-1.1-source.jar 的开发人员在创建 xxx-1.1.jar 后 2 小时打包了此源,他在一些 class 的开头添加了一些注释调试所以,此时当您使用 xxx-1.1-source.jar 提供的代码调试 xxx-1.1.jar 时,源代码不完全匹配。
希望对您有所帮助!