3 Thread 0x7fd0cf38a700 (LWP 2419) "Finalizer" 0x00007fd0cfca0b3a in __waitpid (pid=2541, stat_loc=0x7fd0cf3887ac, options=0) at ../sysdeps/unix/sysv/linux/waitpid.c:29
4 Thread 0x7fd0ba1b5700 (LWP 2422) "gmain" 0x00007fd0cf7b963d in poll () at ../sysdeps/unix/syscall-template.S:84
5 Thread 0x7fd0b99b4700 (LWP 2423) "gdbus" 0x00007fd0cf7b963d in poll () at ../sysdeps/unix/syscall-template.S:84
6 Thread 0x7fd0aa331700 (LWP 2535) "pool" syscall () at ../sysdeps/unix/sysv/linux/x86_64/syscall.S:38
# 略去很多内容 #
Thread 3 (Thread 0x7fe277271700 (LWP 14269)):
#0 0x00007fe277b87b3a in __waitpid (pid=15017, stat_loc=0x7fe27726f76c, options=0) at ../sysdeps/unix/sysv/linux/waitpid.c:29
#1 0x0000557c7d647e70 in ()
#2 0x00007fe277b880c0 in () at /lib/x86_64-linux-gnu/libpthread.so.0
#3 0x00007fe2775f3fcf in __GI_raise (sig=sig@entry=6) at ../sysdeps/unix/sysv/linux/raise.c:51
#4 0x00007fe2775f53fa in __GI_abort () at abort.c:89
#5 0x00007fe277631bd0 in __libc_message (do_abort=do_abort@entry=2, fmt=fmt@entry=0x7fe277726d58 "*** Error in `%s': %s: 0x%s ***\n") at ../sysdeps/posix/libc_fatal.c:175
#6 0x00007fe277637f96 in malloc_printerr (action=3, str=0x7fe27772390a "free(): invalid pointer", ptr=, ar_ptr=) at malloc.c:5049
#7 0x00007fe2776387de in _int_free (av=0x7fe27795ab00 , p=0x557c80582230, have_lock=0) at malloc.c:3905
#8 0x0000000041417cf5 in ()
#9 0x0000557c80582240 in ()
#10 0x0000000000000000 in ()
Thread 1 (Thread 0x7fd0d07a4740 (LWP 2417)):
#0 0x00007fd0cfc9d508 in pthread_cond_timedwait@@GLIBC_2.3.2 () at ../sysdeps/unix/sysv/linux/x86_64/pthread_cond_timedwait.S:225
#1 0x000055c8dacf967f in ()
#2 0x000055c8dad0ff34 in ()
#3 0x000055c8dac8721b in ()
#4 0x000055c8dac87c7c in mono_domain_finalize ()
#5 0x000055c8daadce24 in ()
#6 0x000055c8dab3c09c in mono_main ()
#7 0x000055c8daadaab6 in ()
#8 0x00007fd0cf6fa2b1 in __libc_start_main (main=0x55c8daada9b0, argc=2, argv=0x7ffee51dc8e8, init=, fini=, rtld_fini=, stack_end=0x7ffee51dc8d8) at ../csu/libc-start.c:291
https://bbs.deepin.org/user/48640 https://bbs.deepin.org/user/101846
我在使用 bless 二进制编译器的时候经常遇到崩溃,其中最简单的重现方法是:
1. 命令行启动 bless ( mono /usr/lib/bless/bless.exe );
2. ctrl+o 打开文件对话框,随便选择一个文件打开;
3. 点“x”关闭bless窗口。
这时命令行中会出现崩溃信息( free(): invalid pointer 或者 double free or corruption (out) ),应该是个内存双重释放(double free)的问题。
不做第3步,使用一段时间后也有较大几率崩溃。
我验证了 ubuntu 16.04 中 bless ,版本相同,但是并没有这样的崩溃问题。
bless 是个纯 .net 程序,因此自身出现内存错误的可能性不大,估计是其依赖的库(mono、gtk等)有 bug。
用 valgrind 检查,的确也检测到了 “Invalid free() / delete / delete[] / realloc()”,并且分配内存的地方是 gtk_file_chooser_get_filenames() 函数,看来与文件对话框有关。
验证之后果然如此,只要不用文件对话框就不会崩溃(直接用命令行传递要打开的文件:mono /usr/lib/bless/bless.exe ),用了就会崩溃。
又验证了一下 monodevelpe 程序,也有与文件对话框有关的崩溃现象,但崩溃更快,选中要打开的文件后就崩了,而不需要关闭窗口。用 valgrind 同样定位到 gtk_file_chooser_get_filenames() 函数。看来 mono 运行的 gtk# 2.0 程序都受到了影响。
版本(deepin 15.5 升级到最新):
bless: 0.6.0-5
libgtk2.0-cil: 2.12.40-1.1
libglib2.0-cil: 2.12.40-1.1
libgtk2.0-0: 2.24.31-34deepin
版本(ubuntu 16.04):
bless: 0.6.0-5
libgtk2.0-cil: 2.12.10-6
libglib2.0-cil: 2.12.10-6
libgtk2.0-0: 2.24.30-1ubuntu1.16.04.1
这是 bless 崩溃时的输出:
这是 valgrind 检查 bless 的输出: