Ruby / Glibc coredump(双免费或腐败)
发布时间:2020-12-17 03:43:50 所属栏目:百科 来源:网络整理
导读:我正在使用我自己在 Ruby中编写的分布式持续集成工具.它使用Mike Perham的“政治”分支来分配任务. “政治”模块正在为mDNS部分使用线程. 我偶尔遇到一个我不明白的核心转储: *** glibc detected *** ruby: double free or corruption (fasttop): 0x086d860
我正在使用我自己在
Ruby中编写的分布式持续集成工具.它使用Mike Perham的“政治”分支来分配任务. “政治”模块正在为mDNS部分使用线程.
我偶尔遇到一个我不明白的核心转储: *** glibc detected *** ruby: double free or corruption (fasttop): 0x086d8600 *** ======= Backtrace: ========= /lib/libc.so.6[0xb7cef494] /lib/libc.so.6[0xb7cf0b93] /lib/libc.so.6(cfree+0x6d)[0xb7cf3c7d] /usr/lib/libruby18.so.1.8[0xb7e8adf8] /usr/lib/libruby18.so.1.8(ruby_xmalloc+0x85)[0xb7e8b395] /usr/lib/libruby18.so.1.8[0xb7e5065e] ... /usr/lib/libruby18.so.1.8[0xb7e717f4] /usr/lib/libruby18.so.1.8[0xb7e74296] /usr/lib/libruby18.so.1.8(rb_yield+0x27)[0xb7e7fb57] ======= Memory map: ======== ... 我在Gentoo上运行并使用“-gdbg”重建Ruby和Glibc并关闭条带以获得有意义的核心: ... Core was generated by `ruby /home/develop/dcc/bin/dcc-worker'. Program terminated with signal 6,Aborted. #0 0xb7f20410 in __kernel_vsyscall () (gdb) bt #0 0xb7f20410 in __kernel_vsyscall () #1 0xb7cacb60 in *__GI___open_catalog (cat_name=0x6 <Address 0x6 out of bounds>,nlspath=0xbf9d6f00 " ",env_var=0x0,catalog=0x1) at open_catalog.c:237 #2 0xb7cae498 in __sigdelset (set=0x6) from /lib/libc.so.6 #3 *__GI_sigfillset (set=0x6) at ../signal/sigfillset.c:42 #4 0xb7ce952d in freopen64 (filename=0x2 <Address 0x2 out of bounds>,mode=0xb7db02c8 "" total="%zu" count="%zu"/>n",fp=0x9) at freopen64.c:47 #5 0xb7cef494 in _IO_str_init_readonly (sf=0x86d8600,ptr=0xb7eef5a9 "te213Vb205322 17204220",size=-1210273804) at strops.c:88 #6 0xb7cf0b93 in mALLINFo (av=0xb) at malloc.c:5865 #7 0xb7cf3c7d in __libc_calloc (n=141395456,elem_size=3214793136) at malloc.c:4019 #8 0xb7e8adf8 in ?? () at gc.c:1390 from /usr/lib/libruby18.so.1.8 #9 0x086d8600 in ?? () #10 0xb7e89400 in rb_gc_disable () at gc.c:256 #11 0xb7e8b395 in add_freelist () at gc.c:1087 #12 gc_sweep () at gc.c:1186 #13 garbage_collect () at gc.c:1524 #14 0xb7e5065e in ?? () from /usr/lib/libruby18.so.1.8 #15 0x00000340 in ?? () #16 0x00000000 in ?? () (gdb) 嗯???对我来说,这看起来完全是Ruby实习生.关于stackoverflow的其他“双重免费或腐败”问题我已经看到,也许线程是问题的一部分. 此问题也不会发生在完全相同的位置.我有另一个回溯更长但崩溃也在garbage_collect但路径略有不同: (gdb) bt #0 0xffffe430 in __kernel_vsyscall () #1 0xf7c8b8c0 in *__GI_raise (sig=6) at ../nptl/sysdeps/unix/sysv/linux/raise.c:64 #2 0xf7c8d1f5 in *__GI_abort () at abort.c:88 #3 0xf7cc7e35 in __libc_message (do_abort=2,fmt=0xf7d8daa8 "*** glibc detected *** %s: %s: 0x%s ***n") at ../sysdeps/unix/sysv/linux/libc_fatal.c:170 #4 0xf7ccdd24 in malloc_printerr (action=2,str=0xf7d8dbec "double free or corruption (fasttop)",ptr=0x911f5d0) at malloc.c:6197 #5 0xf7ccf403 in _int_free (av=0xf7daa380,p=0x911f5c8) at malloc.c:4750 #6 0xf7cd24ad in *__GI___libc_free (mem=0x911f5d0) at malloc.c:3716 #7 0xf7e68768 in obj_free () at gc.c:1366 #8 gc_sweep () at gc.c:1174 #9 garbage_collect () at gc.c:1524 #10 0xf7e68be5 in rb_newobj () at gc.c:436 #11 0xf7eb9840 in str_alloc (klass=0) at string.c:67 ... (150 lines of rb_eval/call/yield etc.) 有没有人建议如何隔离并解决这个问题? 解决方法
快速,简单,没有帮助:导出MALLOC_CHECK_ = 2.这会导致glibc在free()期间进行一些额外的检查,以避免堆损坏.一旦检测到损坏,它将中止()并提供核心转储,而不是等到腐败导致实际问题.
不是那么快速和简单,但更有帮助(如果你让它工作):valgrind. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |