【问题标题】:Extremely Random Pango Crashes极其随机的 Pango 崩溃
【发布时间】:2016-12-04 07:07:24
【问题描述】:

正如标题所说,我遇到了一些奇怪的崩溃,显然是由 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

或多或少常见的...

(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次,其余的错误很常见。

具有讽刺意味的是,最后一个出现在我的应用程序还活着的记录时间,然后这个错误突然结束了,甚至没有“常见”错误......

有什么想法会发生什么吗?

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

更多信息:

  1. 我的应用程序是多线程的,但这个错误似乎与线程无关...否则也会出现其他问题!

【问题讨论】:

  • 我们将不得不看一些代码。每当出现警告以帮助调试时,您可以使用G_DEBUG=fatal-warnings 让 gdb 中断。不过,我确实感觉您尝试将 GTK+ 与多线程一起使用会导致这种情况。
  • 我必须同意 andlabs,这有强烈的多线程问题的味道。
  • 我也是这么想的,但是我没有任何其他想法来持续监控进度,同时更新进度条!同时,我会看看 gdb 是否检测到其他东西......
  • 使用基本 C 类型通过线程共享值。 GTK(像大多数 tolkits 一样)不是线程安全的,因此尝试在主线程之外更新小部件可能会导致奇怪的问题。
  • 我不完全理解您的评论...如果我分享我的价值,这实际上是可能的,我无论如何都无法更新我的 ProgressBar,因为我需要设置一个监视器循环会不断更新我的 ProgressBar,导致 Gtk.main() 冻结,这也会冻结我的小部件,所以“0% 到 100%”的 ProgressBar 有点没用......

标签: multithreading python-2.7 gtk critical-section pango


【解决方案1】:

嗯,经过相当长的研究,我确实找到了ThisThisThis

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

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

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

data 这是一个可选参数。它应包含您想传递给function的所有其他数据

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-10-17
    • 2013-08-23
    • 2013-04-21
    • 2011-08-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多