有没有办法执行代码来知道它在eclipse调试器中运行?

时间:2017-03-30 18:33:36

标签: java eclipse debugging pax-exam

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

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

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

更新

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

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

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

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

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

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

2 个答案:

答案 0 :(得分:1)

我将自我回答以解决我原来的问题,虽然这不是我原来问题的答案,第一个答案确实试图解决。然而,这个答案对我没有帮助。

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

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

我不知道Eclipse中的任何功能让我在启动任何调试会话时运行特定的预定义代码片段(我的意思是“任何”,而不是“特定的”调试会话),但是有些东西会出现虽然这有点像黑客,但还是很接近。

我所做的是在设置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")

答案 1 :(得分:0)

如果您正在调试eclipse应用程序,可以使用Platform.isDebug()来检查您的应用程序是使用调试还是运行lanuch配置。

在你的情况下,即检查Junit测试运行,我不知道如何检测我们是否正在使用运行/调试启动配置。但强烈认为必须有一种方法可以使用类似您使用System Class建议的代码来找到它。

为什么你不能在Junit调试启动配置中传递自己的参数/环境变量(在参数选项卡或环境选项卡中使用-D = ?并在测试代码中使用它检测