java - 执行代码有什么方法可以知道它正在 eclipse 调试器中运行吗?

标签 java eclipse debugging pax-exam

我有一些 Pax 考试测试。为了正常执行测试,我只需在 Eclipse 中运行 JUnit 类。如果我想单步执行 Eclipse 调试器中的代码,我必须让它设置调试选项,包括让它等待调试器连接的标志,这是我必须运行的一个单独的进程。我目前正在使用此代码检查“调试”系统属性以启用此功能,但这有点烦人。

如果 @Configuration 方法可以查看系统属性或其他一些条件,如果代码在调试器中执行,这些条件将始终为真,那就太好了,所以我可以使用它作为触发器来启用这些标志,而不是手动设置“调试”系统属性。

我已经尝试在此方法的顶部设置断点,并检查所有系统属性以查找可能在调试器中设置的内容,但我没有看到任何内容。

更新:

为了清楚起见,我需要指出一些有关 Pax Exam 测试如何工作的细节,以更好地解释为什么我正在寻找改进此过程的方法。当测试运行时,它会 fork 一个 Karaf 容器来运行测试。为了在调试器中运行测试,您必须强制在容器中运行的代码设置“suspend=y”标志,该标志将等待用于调试器连接。如果您不进行调试,您肯定不想这样做。

开始运行 pax 考试测试后,您必须运行另一个调试配置,以远程连接到 karaf 容器。从技术上讲,单元测试本身的运行配置不需要是调试配置。

因此,实现这一点的最简单方法是让启动容器的代码检查“调试”系统属性(或任何您想要调用的属性),并在设置该属性后设置调试器端口和“suspend=y”标志。如果未设置该属性,则不会执行此操作。

因此,如果您在没有调试的情况下运行测试,则必须确保未设置系统属性。如果您正在调试,则必须确保它已设置。每次需要来回都必须编辑运行配置,这很烦人。

所以,我的目的是将单元测试运行配置作为调试配置启动(即使它不需要),并让启动 karaf 容器的代码检测它是否作为调试配置运行调试配置,并在这种情况下设置“suspend=y”标志。

我得出的结论是,代码本身无法检测到这一点,但我将在我自己的答案中详细说明如何让调试器为我提供一些帮助。

最佳答案

我将 self 回答来解决我原来的问题,尽管这并不完全是我原来问题的答案,第一个答案确实试图解决这个问题。然而,这个答案对我没有帮助。

我真正的需要是能够运行我的 Pax Exam 测试,以便当我第一次运行单元测试(运行 Pax Exam 测试的“服务器”部分)时,它会知道提供正确的“-Xdebug”如果我要使用调试器,则将参数传递给服务器,如果我不使用调试器,则不要传递参数。我有代码检查“调试”系统属性并使用它来设置正确的“-Xdebug”参数,但如果我需要更改方式,我不想从运行配置中手动添加或删除该参数我正在运行测试(在调试和不调试之间切换)。

因此,据我所知,我能做的最好的事情就是当我在调试器中运行单元测试的“服务器”部分时(否则实际上不必在调试器中运行) ,因为只有客户端需要它),这将导致我正在检查的系统属性被设置,因此它将设置正确的标志。

我不知道 Eclipse 中有任何功能可以让我在启动任何调试 session (我的意思是“任何”,而不是“特定”调试 session )时运行特定的预定义代码片段,但是有一些东西会出现关闭,尽管这有点破解。

我所做的是在设置要启动的 karaf 配置的方法顶部设置一个断点,并使用以下表达式将断点设置为有条件的:

(System.setProperty("debug", "true") != null) && false

这将设置我需要的系统属性,但不会停止,因为最终表达式将为 false。

从技术上讲,它甚至不需要在这个方法中,只需在设置 karaf 选项之前点击它即可。

这仍然是工作区设置,因此我不需要每次启动 Eclipse 时都重新添加它。

更新:

升级到 Oxygen 后,借助新的“跟踪点”功能 ( https://www.eclipse.org/eclipse/news/4.7/jdt.php#toggle-trace-point ),这可能会稍微简单一些。只需“切换跟踪点”并将表达式设置为 'System.setProperty("debug", "true")'

关于java - 执行代码有什么方法可以知道它正在 eclipse 调试器中运行吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43125798/

相关文章:

java - 加载图像时输入== null

Android Auto build with eclipse broken

android - Eclipse 中的时间不正确。怎么改?

java - ArrayList 项和 hibernate 的问题

带有 .* 的 Java 正则表达式组与普通正则表达式

c# - Debug.Assert 和 Debug.Fail 是否应该自由使用,是否应该留在生产代码中?

java - 特殊调试线(java)

debugging - 如何调试 EF5 在运行时生成的 SQL?

java - PowerMock AmazonS3Client 配置问题

java - 将参数传递给 onProgressUpdate 时出现问题 - 异步方法