当 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()

所以出现的情况如下:

  1. Jenkins 调用 python 脚本。他们执行设置和所有前提条件工作,例如启动被测软件
  2. Python 通过 Popen
  3. 调用 TestingApplication
  4. executable 启动并尝试构建应用程序
  5. WPF 检查线程上是否已经有 Dispatcher,没有
  6. WPF 尝试创建一个 Dispatcher,因为 Dispatcher 尚不存在
  7. 崩溃,因为无法创建 Dispatcher

同样,只有在 Jenkins 服务用户下启动时才会发生这种情况。

下面是我为解决问题所做的工作: 被测软件也使用 WPF 创建显示,所以我想看看我是否 运行 可能因为打开太多东西而耗尽了资源。有 5 个 SUT 应用程序。幸运的是,我们 运行 的其中一个软件是一个控制台,在通过 Jenkins 运行 测试时我不需要打开它。因此,我无法启动控制台应用程序,并为测试应用程序释放了足够的资源 运行。

没有回答的是:

  1. 为什么我的服务资源比普通用户少?
  2. 这是因为 Jenkins/Python 还是因为 Windows?
  3. 这个问题有解决方法吗?

这些问题可以在这个问题之外提出,所以我回答只是为了让有类似问题的人可以使用它并关闭它。对于无法关闭额外应用程序的人,我会自己问这些问题。