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

Jan*_*zny 7 java eclipse ide debugging concurrency

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

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

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

Bac*_*chi 9

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


mat*_*t b 4

这让我问以下问题:Eclipse 是否有可能不会足够快地在所有线程的断点处暂停执行,以便我可以查看潜在的竞争条件,因为它没有断点,或者是其他情况(可能)发生?

嗯,不仅如此,调试器的存在也会改变环境,使您无法重现实际运行程序时遇到的相同情况。当某些线程到达断点时,Eclipse 将暂停某些线程,但其他未到达断点的线程可以继续运行并继续更改数据。

使用调试器对竞争条件进行故障排除非常困难 - 您不仅是大海捞针,而且调试器会改变大海捞针的结构。

如果能够推理代码以及处理并发代码所采取的策略,您可能会更好。例如,您是否使用锁保护共享状态?您如何/同步什么?为了能够写入变量foo,线程必须经过哪些步骤?