glib-2.0 中的内存切片错误

Memory slicing error in glib-2.0

我在我的 Gtkmm-3.0 应用程序中遇到了一个错误,根据我的快速 google 搜索,它似乎与内存有关,但我一直无法梳理出可能的原因。该应用程序会随机失败,并且我删除了在每次调用 signal_timeout() 期间更新的所有代码,但没有任何效果。它似乎也与 key/button 印刷机无关。

Valgrind 的用处不大,因为 GUI 需要很长时间才能启动。 Gtk/Glib 用户或之前遇到此错误的 运行 用户的任何建议将不胜感激。下面是我最近的核心文件的堆栈跟踪。

(gdb) bt
    #0  0x00007f4b5de27720 in magazine_cache_push_magazine () at /lib64/libglib-2.0.so.0
    #1  0x00007f4b5de278e2 in private_thread_memory_cleanup () at /lib64/libglib-2.0.so.0
    #2  0x00007f4b5a6b6c22 in __nptl_deallocate_tsd () at /lib64/libpthread.so.0
    #3  0x00007f4b5a6b6e33 in start_thread () at /lib64/libpthread.so.0
    #4  0x00007f4b5cabf34d in clone () at /lib64/libc.so.6

这几乎可以肯定是您的应用程序或它使用的某个库中的堆损坏错误,而不是 GLib 中的错误。调试这些问题的唯一真正方法是使用 Valgrind。确保你 运行 它在环境中设置 G_SLICE=always-malloc,因为这将禁用 Gslice 并使用 malloc() 代替,Valgrind 可以更好地检测。

如果 Valgrind 真的不能为您的应用程序工作,您可以尝试更简单的 glibc 堆一致性检查,通过在环境中设置 MALLOC_CHECK_=1 启用:https://www.gnu.org/software/libc/manual/html_node/Heap-Consistency-Checking.html#Heap-Consistency-Checking