我正在处理的代码有很多调用来创建一个新的字符串和东西..但最近在将服务器升级到12.10 Ubuntu后,我开始面临一些麻烦。一些子进程卡在futex
中。于是我就和连接GDB
到正在运行的过程,是在futex
很长一段时间,我做了backtrace
,发现以下日志在调用malloc和死锁程序时出现分段错误futex
#0 0x00007f563afc69bb in ??() from /lib/x86_64-linux-gnu/libc.so.6
#1 0x00007f563af4a221 in ??() from /lib/x86_64-linux-gnu/libc.so.6
#2 0x00007f563af47fa7 in malloc() from /lib/x86_64-linux-gnu/libc.so.6
#3 0x00007f563afcfbfa in backtrace_symbols() from /lib/x86_64-linux-gnu/libc.so.6
#4 0x0000000000446945 in sig_segv (signo=<optimized out>) at FILE THAT HAS THE HANDLER,SIGHANDLER
#5 <signal handler called>
#6 0x00007f563aefb425 in raise() from /lib/x86_64-linux-gnu/libc.so.6
#7 0x00007f563aefeb8b in abort() from /lib/x86_64-linux-gnu/libc.so.6
#8 0x00007f563af3939e in ??() from /lib/x86_64-linux-gnu/libc.so.6
#9 0x00007f563af43b96 in ??() from /lib/x86_64-linux-gnu/libc.so.6
#10 0x00007f563af463e8 in ??() from /lib/x86_64-linux-gnu/libc.so.6
#11 0x00007f563af47fb5 in malloc() from /lib/x86_64-linux-gnu/libc.so.6
#12 0x00007f563b7f660d in operator new(unsigned long)() from /usr/lib/x86_64-linux-gnu/libstdc++.so.6
#13 0x00007f563b8533b9 in std::string::_Rep::_S_create(unsigned long, unsigned long, std::allocator<char> const&)()
from /usr/lib/x86_64-linux-gnu/libstdc++.so.6
#14 0x00007f563b854d95 in char* std::string::_S_construct<char const*>(char const*, char const*, std::allocator<char> const&, std::forward_iterator_tag)() from /usr/lib/x86_64-linux-gnu/libstdc++.so.6
#15 0x00007f563b854e73 in std::basic_string<char, std::char_traits<char>, std::allocator<char> >::basic_string(char const*, std::allocator<char> const&)() from /usr/lib/x86_64-linux-gnu/libstdc++.so.6
#16 0x0000000000412362 in MyString (bs=0x4aabd6 "-", this=0x7fffe854f940) at CONSTRUCTOR FROM C-STRING MyString(const char* bs):std::string(bs) {};
#17 A FUNCTION THAT CALLS THE ABOVE LINE
我很困惑。我检查了内存,并且PC拥有将近20GB的可用内存。那么函数在malloc
中崩溃的机会是多少?我得到它为什么卡在futex
,但为什么malloc? 我真的很想得到这个解释。
的崩溃发生这种类似被调用后:
MyString(const char* bs):std::string(bs) {};
此行被称为一个简单的C字符串转换成C++类型的std :: string。但这个班是我自己的班。由于主要有两个原因,我无法在这里给出整个代码。 1)代码由我的公司拥有。 2)它该死的长。
我真的很抱歉。我只需要解释为什么它会在malloc
中崩溃,并因此导致死锁,因为sighandler
也要求malloc
,并且它等待上一个锁释放,而不是。
邮政编码请 – 2013-03-18 12:58:31
只需使用'valgrind'!它会指向导致段错误的确切代码行。 – Dariusz 2013-03-18 13:17:39