极其随机的 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" 错误...
知道会发生什么吗?
正如我之前所说,我的应用程序正常运行,直到上述错误之一结束。
更多信息:
- 我的应用程序是 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_IDLE
和 function
必须是包含对 Gtk 的所有调用的函数。
data
这是一个可选参数。它应包含您想传递给 function
的所有其他数据
正如标题所说,我 运行 经历过一些奇怪的崩溃,显然是由 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" 错误...
知道会发生什么吗?
正如我之前所说,我的应用程序正常运行,直到上述错误之一结束。
更多信息:
- 我的应用程序是 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_IDLE
和 function
必须是包含对 Gtk 的所有调用的函数。
data
这是一个可选参数。它应包含您想传递给 function