有什么方法可以让执行代码知道它在 Eclipse 调试器中是 运行?
Any way for executing code to know it's running in the eclipse debugger?
我有一些 Pax 考试。为了正常执行测试,我只是 运行 Eclipse 中的 JUnit class。如果我想单步执行 Eclipse 调试器中的代码,我必须让它设置调试选项,包括让它等待调试器连接的标志,这是我必须 运行 的一个单独过程。我目前正在检查 "debug" 系统 属性 的代码以启用此功能,但这有点烦人。
如果 @Configuration 方法可以查看系统 属性 或代码在调试器中执行时始终为真的某些其他条件,那就太好了,所以我可以将其用作触发器启用这些标志,而不是手动设置 "debug" 系统 属性.
我已经尝试在此方法的顶部设置断点并检查所有系统属性以查找可能在调试器中设置的内容,但我没有看到任何内容。
更新:
为了清楚起见,我需要指出有关 Pax Exam 测试工作原理的一些细节,以更好地解释为什么我正在寻找改进此过程的方法。当测试 运行s 时,它 fork 一个 Karaf 容器到 运行 测试。为了 运行 在调试器中测试,你必须强制代码 运行s 在容器中设置 "suspend=y" 标志,这将等待调试器连接。如果你不调试,你肯定不想这样做。
开始 pax 考试 运行ning 后,您必须 运行 另一个调试配置,以远程连接到 karaf 容器。从技术上讲,单元测试本身的 运行 配置不需要是调试配置。
因此,实现这一目标的最简单方法是让启动容器的代码检查 "debug" 系统 属性(或任何你想调用的),以及何时已设置,以设置调试器端口和 "suspend=y" 标志。如果未设置 属性,则不会执行此操作。
因此,如果您 运行 在没有调试的情况下进行测试,则必须确保未设置系统 属性。如果您正在调试,则必须确保它已设置。每次来回都要编辑运行配置,很烦人。
所以,我打算启动单元测试 运行 配置作为调试配置(即使它不需要),以及启动 karaf 容器的代码来检测它被 运行 作为调试配置,并在这种情况下设置 "suspend=y" 标志。
我得出结论,代码本身无法检测到这一点,但我将在我自己的回答中详细说明如何让调试器稍微帮助我。
如果您正在调试 eclipse 应用程序,您可以使用 Platform.isDebug()
检查您的应用程序是使用调试还是 运行 lanuch 配置。
在您的情况下,即检查 Junit 测试 运行,我不知道如何检测我们是否正在使用 run/debug 启动配置。但坚信必须有一种方法可以像您使用系统 Class.
建议的那样使用代码找到它
为什么不能在 Junit 调试启动配置中传递自己的 argument/environment 变量(在 Arguments 选项卡或环境选项卡 中使用 -D=?并使用它在测试代码中检测?
我将自行回答以解决我最初的问题,尽管这并不是我最初问题的答案,第一个答案确实试图解决这个问题。然而,这个答案对我没有帮助。
我真正的需要是能够 运行 我的大同考试测试,这样当我第一次 运行 单元测试时,运行 宁 "server" 部分在 Pax Exam 测试中,如果我要使用调试器,它将知道向服务器提供正确的“-Xdebug”参数,如果我不使用调试器则不会。我有代码检查 "debug" 系统 属性 并使用它来设置正确的“-Xdebug”参数,但我不想手动添加或从 运行 配置,如果我需要更改我的测试方式 运行(在调试和不调试之间)。
因此,据我所知,我能做的最好的事情就是当我 运行 调试器中单元测试的 "server" 部分时(否则不会'实际上不必在调试器中,因为只有客户端需要它),这将导致我正在检查的系统属性被设置,因此它将设置正确的标志。
我不知道 Eclipse 中有任何功能可以让我在启动任何调试会话时 运行 特定的预定义代码片段(我的意思是 "any",而不是 "particular"调试会话),但有些东西很接近,尽管有点 hack。
我所做的是在设置要启动的karaf配置的方法顶部设置一个断点,并且我将断点设置为有条件的,使用以下表达式:
(System.setProperty("debug", "true") != null) && false
这将设置我需要的系统 属性,但不会停止,因为最终表达式将为假。
从技术上讲,它甚至不需要在这个方法中,它只需要在设置 karaf 选项之前被击中。
它保留为工作区设置,因此我不需要在每次启动 Eclipse 时都重新添加它。
更新:
升级到 Oxygen 后,使用新的 "tracepoints" 功能 (https://www.eclipse.org/eclipse/news/4.7/jdt.php#toggle-trace-point),这会稍微简单一些。只需 "toggle tracepoint" 并将表达式设置为 'System.setProperty("debug", "true")
'
我有一些 Pax 考试。为了正常执行测试,我只是 运行 Eclipse 中的 JUnit class。如果我想单步执行 Eclipse 调试器中的代码,我必须让它设置调试选项,包括让它等待调试器连接的标志,这是我必须 运行 的一个单独过程。我目前正在检查 "debug" 系统 属性 的代码以启用此功能,但这有点烦人。
如果 @Configuration 方法可以查看系统 属性 或代码在调试器中执行时始终为真的某些其他条件,那就太好了,所以我可以将其用作触发器启用这些标志,而不是手动设置 "debug" 系统 属性.
我已经尝试在此方法的顶部设置断点并检查所有系统属性以查找可能在调试器中设置的内容,但我没有看到任何内容。
更新:
为了清楚起见,我需要指出有关 Pax Exam 测试工作原理的一些细节,以更好地解释为什么我正在寻找改进此过程的方法。当测试 运行s 时,它 fork 一个 Karaf 容器到 运行 测试。为了 运行 在调试器中测试,你必须强制代码 运行s 在容器中设置 "suspend=y" 标志,这将等待调试器连接。如果你不调试,你肯定不想这样做。
开始 pax 考试 运行ning 后,您必须 运行 另一个调试配置,以远程连接到 karaf 容器。从技术上讲,单元测试本身的 运行 配置不需要是调试配置。
因此,实现这一目标的最简单方法是让启动容器的代码检查 "debug" 系统 属性(或任何你想调用的),以及何时已设置,以设置调试器端口和 "suspend=y" 标志。如果未设置 属性,则不会执行此操作。
因此,如果您 运行 在没有调试的情况下进行测试,则必须确保未设置系统 属性。如果您正在调试,则必须确保它已设置。每次来回都要编辑运行配置,很烦人。
所以,我打算启动单元测试 运行 配置作为调试配置(即使它不需要),以及启动 karaf 容器的代码来检测它被 运行 作为调试配置,并在这种情况下设置 "suspend=y" 标志。
我得出结论,代码本身无法检测到这一点,但我将在我自己的回答中详细说明如何让调试器稍微帮助我。
如果您正在调试 eclipse 应用程序,您可以使用 Platform.isDebug()
检查您的应用程序是使用调试还是 运行 lanuch 配置。
在您的情况下,即检查 Junit 测试 运行,我不知道如何检测我们是否正在使用 run/debug 启动配置。但坚信必须有一种方法可以像您使用系统 Class.
建议的那样使用代码找到它为什么不能在 Junit 调试启动配置中传递自己的 argument/environment 变量(在 Arguments 选项卡或环境选项卡 中使用 -D=?并使用它在测试代码中检测?
我将自行回答以解决我最初的问题,尽管这并不是我最初问题的答案,第一个答案确实试图解决这个问题。然而,这个答案对我没有帮助。
我真正的需要是能够 运行 我的大同考试测试,这样当我第一次 运行 单元测试时,运行 宁 "server" 部分在 Pax Exam 测试中,如果我要使用调试器,它将知道向服务器提供正确的“-Xdebug”参数,如果我不使用调试器则不会。我有代码检查 "debug" 系统 属性 并使用它来设置正确的“-Xdebug”参数,但我不想手动添加或从 运行 配置,如果我需要更改我的测试方式 运行(在调试和不调试之间)。
因此,据我所知,我能做的最好的事情就是当我 运行 调试器中单元测试的 "server" 部分时(否则不会'实际上不必在调试器中,因为只有客户端需要它),这将导致我正在检查的系统属性被设置,因此它将设置正确的标志。
我不知道 Eclipse 中有任何功能可以让我在启动任何调试会话时 运行 特定的预定义代码片段(我的意思是 "any",而不是 "particular"调试会话),但有些东西很接近,尽管有点 hack。
我所做的是在设置要启动的karaf配置的方法顶部设置一个断点,并且我将断点设置为有条件的,使用以下表达式:
(System.setProperty("debug", "true") != null) && false
这将设置我需要的系统 属性,但不会停止,因为最终表达式将为假。
从技术上讲,它甚至不需要在这个方法中,它只需要在设置 karaf 选项之前被击中。
它保留为工作区设置,因此我不需要在每次启动 Eclipse 时都重新添加它。
更新:
升级到 Oxygen 后,使用新的 "tracepoints" 功能 (https://www.eclipse.org/eclipse/news/4.7/jdt.php#toggle-trace-point),这会稍微简单一些。只需 "toggle tracepoint" 并将表达式设置为 'System.setProperty("debug", "true")
'