当 Jenkins 服务中 运行 但不是作为普通用户时,WPF 应用程序崩溃
WPF application crashes when run in Jenkins service but not as a regular user
我正在使用 Jenkins 在我们的内部测试软件上自动化一些软件测试。它是用 C# 和 WPF 编写的。我正在使用没有前端的程序版本,但它仍然会调用 WPF 以启动服务。使用 subprocess.Popen
通过 python 脚本启动测试应用程序
在Jenkins slave进程下运行ning时出现如下错误:
Unhandled Exception: System.ComponentModel.Win32Exception: The operation completed successfully
at MS.Win32.UnsafeNativeMethods.RegisterClassEx(WNDCLASSEX_D wc_d)
...
根据我的研究,windows 原子 table 似乎出了问题。奇怪的是,当 运行 将 python 脚本作为本地用户时,我没有 运行 遇到同样的问题,只有当它是 Jenkins 服务时才会崩溃 运行宁脚本。
windows 服务的本地原子 table 是否有一些限制?
Jenkins 是否占用 atom table 个条目?
更新 1:
我对崩溃做了更多研究,一些资源说 WPF 可能存在 windows 句柄泄漏,所以我插入了一些电源 shell 调用来检查有多少活动句柄在系统上。
似乎没有任何被测软件的句柄泄漏,我看到大约 50-60k 句柄,而 jenkins 运行正在测试脚本,这与什么是一致的我在 运行 在我的用户帐户下查看它。看起来 Jenkins 正在干扰 WPF 构建程序的能力(错误的完整调用堆栈在 Main() 构造函数中),但我不知道为什么会那样做。
更新 2:
一些额外的信息,因为我认为它是相关的,这里是完整的调用堆栈:
Unhandled Exception: System.ComponentModel.Win32Exception: The operation completed successfully
at MS.Win32.UnsafeNativeMethods.RegisterClassEx(WNDCLASSEX_D wc_d)
at MS.Win32.HwndWrapper..ctor(Int32 classStyle, Int32 style, Int32 exStyle, Int32 x, Int32 y, Int32 width, Int32 height, String name, IntPtr parent, HwndWrapperHook[] hooks)
at System.Windows.Threading.Dispatcher..ctor()
at System.Windows.Threading.Dispatcher.get_CurrentDispatcher()
at System.Windows.Application..ctor()
at <TestingApplication>.ScriptHost.App..ctor()
at <TestingApplication>.ScriptHost.App.Main()
所以出现的情况如下:
- Jenkins 调用 python 脚本。他们执行设置和所有前提条件工作,例如启动被测软件
- Python 通过 Popen
调用 TestingApplication
- executable 启动并尝试构建应用程序
- WPF 检查线程上是否已经有 Dispatcher,没有
- WPF 尝试创建一个 Dispatcher,因为 Dispatcher 尚不存在
- 崩溃,因为无法创建 Dispatcher
同样,只有在 Jenkins 服务用户下启动时才会发生这种情况。
下面是我为解决问题所做的工作:
被测软件也使用 WPF 创建显示,所以我想看看我是否 运行 可能因为打开太多东西而耗尽了资源。有 5 个 SUT 应用程序。幸运的是,我们 运行 的其中一个软件是一个控制台,在通过 Jenkins 运行 测试时我不需要打开它。因此,我无法启动控制台应用程序,并为测试应用程序释放了足够的资源 运行。
没有回答的是:
- 为什么我的服务资源比普通用户少?
- 这是因为 Jenkins/Python 还是因为 Windows?
- 这个问题有解决方法吗?
这些问题可以在这个问题之外提出,所以我回答只是为了让有类似问题的人可以使用它并关闭它。对于无法关闭额外应用程序的人,我会自己问这些问题。
我正在使用 Jenkins 在我们的内部测试软件上自动化一些软件测试。它是用 C# 和 WPF 编写的。我正在使用没有前端的程序版本,但它仍然会调用 WPF 以启动服务。使用 subprocess.Popen
通过 python 脚本启动测试应用程序在Jenkins slave进程下运行ning时出现如下错误:
Unhandled Exception: System.ComponentModel.Win32Exception: The operation completed successfully
at MS.Win32.UnsafeNativeMethods.RegisterClassEx(WNDCLASSEX_D wc_d)
...
根据我的研究,windows 原子 table 似乎出了问题。奇怪的是,当 运行 将 python 脚本作为本地用户时,我没有 运行 遇到同样的问题,只有当它是 Jenkins 服务时才会崩溃 运行宁脚本。
windows 服务的本地原子 table 是否有一些限制?
Jenkins 是否占用 atom table 个条目?
更新 1:
我对崩溃做了更多研究,一些资源说 WPF 可能存在 windows 句柄泄漏,所以我插入了一些电源 shell 调用来检查有多少活动句柄在系统上。
似乎没有任何被测软件的句柄泄漏,我看到大约 50-60k 句柄,而 jenkins 运行正在测试脚本,这与什么是一致的我在 运行 在我的用户帐户下查看它。看起来 Jenkins 正在干扰 WPF 构建程序的能力(错误的完整调用堆栈在 Main() 构造函数中),但我不知道为什么会那样做。
更新 2: 一些额外的信息,因为我认为它是相关的,这里是完整的调用堆栈:
Unhandled Exception: System.ComponentModel.Win32Exception: The operation completed successfully
at MS.Win32.UnsafeNativeMethods.RegisterClassEx(WNDCLASSEX_D wc_d)
at MS.Win32.HwndWrapper..ctor(Int32 classStyle, Int32 style, Int32 exStyle, Int32 x, Int32 y, Int32 width, Int32 height, String name, IntPtr parent, HwndWrapperHook[] hooks)
at System.Windows.Threading.Dispatcher..ctor()
at System.Windows.Threading.Dispatcher.get_CurrentDispatcher()
at System.Windows.Application..ctor()
at <TestingApplication>.ScriptHost.App..ctor()
at <TestingApplication>.ScriptHost.App.Main()
所以出现的情况如下:
- Jenkins 调用 python 脚本。他们执行设置和所有前提条件工作,例如启动被测软件
- Python 通过 Popen 调用 TestingApplication
- executable 启动并尝试构建应用程序
- WPF 检查线程上是否已经有 Dispatcher,没有
- WPF 尝试创建一个 Dispatcher,因为 Dispatcher 尚不存在
- 崩溃,因为无法创建 Dispatcher
同样,只有在 Jenkins 服务用户下启动时才会发生这种情况。
下面是我为解决问题所做的工作: 被测软件也使用 WPF 创建显示,所以我想看看我是否 运行 可能因为打开太多东西而耗尽了资源。有 5 个 SUT 应用程序。幸运的是,我们 运行 的其中一个软件是一个控制台,在通过 Jenkins 运行 测试时我不需要打开它。因此,我无法启动控制台应用程序,并为测试应用程序释放了足够的资源 运行。
没有回答的是:
- 为什么我的服务资源比普通用户少?
- 这是因为 Jenkins/Python 还是因为 Windows?
- 这个问题有解决方法吗?
这些问题可以在这个问题之外提出,所以我回答只是为了让有类似问题的人可以使用它并关闭它。对于无法关闭额外应用程序的人,我会自己问这些问题。