【问题标题】:Variable acts differently according to position of breakpoint变量根据断点的位置有不同的作用
【发布时间】:2011-12-25 22:12:53
【问题描述】:

这是一个非常奇怪的问题,我终其一生都无法弄清楚问题所在。

我有两个字符串数组,声明在类的顶部:

String[] artistsURLIndexArray;
String[] artistsOnlyArray;

它们都在单独的线程(后台工作者)中更新,该线程在 onCreate 方法中运行。我在调试中看到一切正常,并且数组已正确更新。

在后台线程之后我有以下代码(仍在 onCreate 方法中):

String[] test;

if(artistsOnlyArray == null) // point A
{
    test = new String[] { "empty...", "asd" }; // point B
}
else
{           
    test = new String[] { "not empty!", "asd" }; // point C
}

现在,当我只是“运行”应用程序(没有调试)时,test[0] 是“空的......”。也就是说,artistsOnlyArray 为空!这不应该是这样。 (顺便说一句,我正在使用列表视图直观地测试 test 数组。)

如果我继续在 B 点放置断点并调试应用程序,应用程序会在此处停止(中断)。这当然是意料之中的,因为它声称 artistsOnlyArray 为空。

如果我在 C 点放置断点,则不会到达断点。也“好的”。

但是,如果我在 A 点放置断点,一切都会改变。断点当然到了,现在要检查数组是否为空。我按 F8 继续(我正在使用 Eclipse),突然间,test[0]“不是空的!”。我还可以看到artistsOnlyArray 是正确的(不为空)。

为什么断点的出现(和位置)会导致这种行为?

【问题讨论】:

  • 听起来您的后台线程在 oncreate 代码之前或之后运行,具体取决于断点。通常,在您的线程屈服之前,新线程不会启动。调试器导致你的主线程让步,因此给了新线程一个运行的机会。

标签: android debugging breakpoints


【解决方案1】:

我只能假设这是因为在 A 点放置断点时工作线程有“额外时间”。

当您不放置任何断点时,if 语句的执行发生在任何工作线程填充数组之前,因此它进入if

另一方面,当您在 A 点放置断点时,您会为工作线程留出时间来填充数组。因此,当您继续时,该数组已被填充并输入 else

【讨论】:

【解决方案2】:

您自己回答:“它们都在单独的线程中更新”。

断点可能导致“竞态”条件,其中线程的相对时间受到干扰。具体来说,更新线程可能会在断点发生之前被阻塞,也可能不会阻塞。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多