2013-03-18 62 views
1

我正在处理的代码有很多调用来创建一个新的字符串和东西..但最近在将服务器升级到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,并且它等待上一个锁释放,而不是。

+2

邮政编码请 – 2013-03-18 12:58:31

+0

只需使用'valgrind'!它会指向导致段错误的确切代码行。 – Dariusz 2013-03-18 13:17:39

回答

1

看起来你可能会在信号处理程序中调用malloc()(间接地通过backtrace_symbols()),不要。

malloc()不是异步信号安全。在信号处理程序中调用它,而其他代码在malloc()中时可能会使您陷入死锁(就像它在此处那样)。

使用backtrace_symbols_fd()相反,它不会叫malloc()

+0

谢谢,这将解决僵局..但是如何发生崩溃? – 2013-03-18 13:07:19

+0

@PrasanthMadhavan:由于代码中的错误而发生崩溃。 (考虑到您发布的上下文数量,我们还能说些什么?) – 2013-03-18 13:10:40

+0

猜测,您可能会在某处损坏堆。您可以使用valgrind来查找问题。您也可以尝试将环境变量'MALLOC_CHECK_'设置为'3',这可能会使它更早地“中止()”,可能更接近腐败点。 – Hasturkun 2013-03-18 13:11:03

1

由字符串指向的内存可能损坏/释放等。

这个问题可能是以前有,现在得到了体现,因为变化在编译器/其他库中。

用valgrind运行你的代码来调试内存损坏问题。