Android调试究竟是如何工作的以及为什么我的应用程序在调试时表现不同?

时间:2013-11-20 15:04:39

标签: android performance debugging dalvik

我有一个应用程序解码传入的H264视频流。当我正常使用该应用程序时,在查看流时会出现视觉瑕疵。

奇怪的是,一旦我开始调试过程,工件就会消失!当我停止调试(即从PC上拔下设备)时,工件会再次出现。

这就是为什么我想向您了解专家:如何在Android上进行调试以及如何更改流程'行为吗

1 个答案:

答案 0 :(得分:2)

我假设您正在使用Java语言调试器,而不是像gdb这样的本机调试器。

当您附加调试器时,Dalvik停止执行JIT编译的代码并在解释器中运行所有内容。它使用一个效率较低的解释器版本,它有一些额外的调试器支持,所以如果你(说)“跳过”一个方法调用,并且该方法抛出一个异常,你就停止了。 (如果它所做的只是在下面的指令中设置了一个临时断点,那么你永远不会打它。)

“调试解释器”和常规“可移植”解释器是基于相同的源代码构建的 - 它是相同的源文件,构建两次,具有不同的宏定义 - 因此行为的差异通常与性能有关而不是执行。

JIT编译器本地生成并执行代码,因此它有点不同。与翻译一样,在过去的几年中,除了偶尔OEM modification之外,它没有太大的变化,并且不太可能是问题的原因。

调试和非调试之间最显着的区别是性能。任何具有竞争条件的行为都会有不同的行为,因为您将从使用JIT编译的本机代码的快速解释器变为较慢的解释器。如果不知道代码的结构,就不可能说这是否是问题,但您可以找到SMP on Android here的概述。