极其随机的 Pango 崩溃

Extremely Random Pango Crashes

正如标题所说,我 运行 经历过一些奇怪的崩溃,显然是由 Pango 或相关问题引起的。

我的程序运行正常,一切都按时完成,没有奇怪的视觉故障或任何其他类型的错误,但这种错误通常会导致崩溃。有时它只是抛出一个异常并继续,但这些异常中大约有 10% 以崩溃告终,更不用说我不知道​​是什么导致了它。

以下是一些不同尝试的日志:

最常见的:

(App:23224): Pango-CRITICAL **: pango_layout_set_width: assertion 'layout != NULL' failed

(App:23224): Pango-CRITICAL **: pango_layout_get_width: assertion 'layout != NULL' failed

(App:23224): Pango-CRITICAL **: pango_layout_get_extents: assertion 'layout != NULL' failed

(App:23224): Pango-CRITICAL **: pango_layout_is_wrapped: assertion 'layout != NULL' failed

(App:23224): Pango-CRITICAL **: pango_layout_is_ellipsized: assertion 'layout != NULL' failed
./Def:822: Warning: g_object_ref: assertion 'G_IS_OBJECT (object)' failed
  Gtk.main()

(App:23224): Pango-CRITICAL **: pango_layout_get_extents: assertion 'layout != NULL' failed

more-or-less普通的...

(App:22385): Pango-CRITICAL **: pango_layout_is_wrapped: assertion 'layout != NULL' failed

(App:22385): Pango-CRITICAL **: pango_layout_is_ellipsized: assertion 'layout != NULL' failed
./Def:820: Warning: g_object_ref: assertion 'G_IS_OBJECT (object)' failed
  Gtk.main()

(App:22385): Pango-CRITICAL **: pango_layout_get_extents: assertion 'layout != NULL' failed

最奇怪的是:

Pango:ERROR:/build/buildd/pango1.0-1.36.3/./pango/pango-layout.c:3916:pango_layout_check_lines: assertion failed: (!layout->log_attrs)

最后一个只看过1次,其余的错误都是常见的。

具有讽刺意味的是,当我的应用程序仍然存在创纪录的时间时,最后一个出现了,然后这个错误突然结束了,甚至没有 "common" 错误...

知道会发生什么吗?

正如我之前所说,我的应用程序正常运行,直到上述错误之一结束。

更多信息:

  1. 我的应用程序是 multi-threaded,但这个错误似乎与线程无关...否则其他东西也应该抱怨!

好吧,经过相当长时间的研究,我确实找到了 This, This and This

他们都很有用。第一个是另一个 SO 关于同一主题的问题的 link,第二个是 GNOME 开发者官方网站的 link,我是否找到了关于一个奇怪的 Gdk 函数的信息: Gdk.threads_add_idle,第三个是来自上述 Gdk 函数的错误报告的 link,因为在 Python 中它要求 3 个参数,而在 C 中只要求 2 个,但是有它阐明了为什么要求 3.

在我发现 Gdk.threads_add_idle 之后解决这个问题并不难。

我只需要将所有对 Gtk 的调用移动到函数,并在第二个线程中,将所有这些调用更改为 Gdk.threads_add_idle(priority, function, data),其中 priority 应该是 GLib.PRIORITY_DEFAULT_IDLEfunction 必须是包含对 Gtk 的所有调用的函数。

data 这是一个可选参数。它应包含您想传递给 function

的所有其他数据