在死锁futex中调用malloc和程序时出现分段错误

时间:2013-03-18 12:56:55

标签: c++ ubuntu gdb malloc futex

我正在处理的代码有很多调用来创建一个新的字符串和东西..但最近在将服务器升级到12.10 Ubuntu后,我开始面临一些麻烦。一些子进程卡在futex中。所以我将GDB附加到futex中正在运行的流程很长一段时间,我做了backtrace并找到了以下日志

#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的可用RAM内存。那么函数在malloc崩溃的可能性有多大?我明白为什么它被卡在futex中,但为什么要使用malloc? 我真的很想得到解释。

在这之后发生了崩溃:

    MyString(const char* bs):std::string(bs) {};

调用此行将简单的c-string转换为c ++类型的std :: string。但是这堂课是我自己的。由于主要有两个原因,我无法在此处提供完整的代码。 1)代码归我公司所有。 2)该死的。

我真的很抱歉。我只需要解释为什么它会在malloc中崩溃并因此导致死锁,因为sighandler也会调用malloc并等待上一次锁定释放,这不会

2 个答案:

答案 0 :(得分:1)

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

malloc() async-signal safe。在其他代码位于malloc()时将其调用到信号处理程序中可能会使您陷入僵局(就像在此处所做的那样)。

使用backtrace_symbols_fd()代替,它不会调用malloc()

答案 1 :(得分:1)

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

由于编译器/其他库的更改,此问题可能已经存在并且现在已经显现出来。

使用valgrind运行代码,以调试内存损坏问题。