繁体   English   中英

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

[英]Eclipse & other Java IDEs for debugging concurrent code

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

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

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

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

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

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

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

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM