Eclipse&用于调试并发代码的其他Java IDE

时间:2010-07-13 19:30:27

标签: java eclipse ide concurrency debugging

我目前正在研究一些似乎有一些竞争条件的并发代码。我正在尝试使用我当前的IDE Eclipse调试代码,但我并不完全满意。特别是,对于变量存在竞争条件,使得在访问它的方法之一没有断点(“获取它”),变量设置方法不完成,并且变量被设置为空。但是,如果我在访问方法上设置了一个断点,并按住F8 - 默认的跨越按钮 - 变量几乎总是设置为正确的(非空)值。

这引出了我提出以下问题:Eclipse是否有可能不会在所有线程上的断点上暂停执行,以至于我可以看到潜在的竞争条件,因为它没有断点,或者是其他东西(可能)发生了什么?

如果Eclipse没有快速暂停执行,是否有其他适用于Java的IDE /调试程序可以更好地完成此任务?请注意,我不是在寻找像Java Pathfinder这样的正式验证工具 - 我不想检查竞争条件是否存在,我想在我的调试器中看到它们展开(如果只是因为它可能有趣的话)。

3 个答案:

答案 0 :(得分:9)

默认情况下,如果一个线程到达断点,Eclipse将不会挂起其他线程。但是,您可以在Window > Preferences > Java > Debug > Default suspend policy for new breakpoints =>中更改此行为'Suspend VM'

答案 1 :(得分:4)

  

这引出了我提出以下问题:Eclipse是否有可能不会在所有线程上的断点上暂停执行,以至于我可以看到潜在的竞争条件,因为它没有断点,或者是其他东西(可能)发生了什么?

嗯,不仅仅是这样,而且调试器的出现改变了环境,使得您无法再现在运行程序时获得的相同情况。 Eclipse会在遇到断点时暂停某些线程,但其他没有遇到断点的线程可以继续运行并继续更改数据。

使用调试器对竞争条件进行故障排除非常困难 - 您不仅要在大海捞针中寻找针头,还要调试器改变大海捞针的结构。

您可能更好地理解代码和处理并发代码所采取的策略。例如,您是否使用锁保护共享状态?你是如何/正在同步的?为了能够写入变量foo,线程必须经历哪些步骤?

答案 2 :(得分:1)

请记住,无法保证一步完成访问/设置变量。您可能希望使用原子对象来确定。

还记得可以缓存变量值。要确保它没有缓存,请使用volatile。

如果忘了,可以设置变量的断点。只需单击变量声明的左侧,就像创建正常断点一样。