我有一个可解码传入的H264视频流的应用程序。正常使用该应用程序时,在观看视频流时会出现视觉失真。
奇怪的是,一旦我开始调试过程,工件就消失了!当我停止调试(即从PC上拔下设备的电源)时,工件再次出现。
这就是为什么我想向您了解专家:为什么在Android上进行调试如何工作,以及它以什么方式改变流程的行为?
我将假设您使用的是Java语言调试器,而不是像gdb这样的本机调试器。
连接调试器时,Dalvik停止执行JIT编译的代码,并在解释器中运行所有内容。它使用效率较低的解释器版本,该版本具有一些额外的调试器支持,因此,如果您(说)“跳过”方法调用,并且该方法引发异常,则停止。(如果所做的只是在以下指令上设置了一个临时断点,则您永远都不会遇到它。)
“调试解释器”和常规的“便携式”解释器是从基本相同的源代码构建的-它是相同的源文件,两次构建,具有不同的宏定义-因此行为上的差异通常与性能有关,而与执行无关。
JIT编译器本机生成并执行代码,因此有很多不同。像解释器一样,在过去的几年中,它的变化不大,除了偶尔的OEM修改外,它不太可能成为问题的起因。
调试和非调试之间最显着的区别是性能。带有竞争条件的任何事物的行为都会有所不同,因为您正在从使用JIT编译的本机代码的快速解释器过渡到较慢的解释器。在不知道代码结构的情况下,无法确定这是否是问题所在,但是您可以在此处找到Android上SMP的概述。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句