В коде, над которым я работаю, много вызовов для создания новых строк и прочего. Но недавно после обновления серверов до 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
Я сбит с толку. Я проверил память, и на ПК было почти 20 ГБ свободной оперативной памяти. Так каковы шансы того, что функция не работает в malloc
? Я понимаю, почему он застрял в futex
но почему malloc?
Я бы очень хотел получить объяснение этому.
Сбой происходит после того, как это называется:
MyString(const char* bs):std::string(bs) {};
Эта строка вызывается для преобразования простой c-строки в std :: string типа c ++. Но класс мой. Я не могу дать весь код здесь по двум причинам.
1) Код принадлежит моей компании.
2) Это чертовски долго.
Я очень сожалею. Мне просто нужно объяснение того, почему это произойдет malloc
и, следовательно, вызывая тупик, потому что sighandler
также призывает к malloc
и он ожидает снятия предыдущей блокировки, чего не будет.
Похоже, вы звоните malloc()
(косвенно, через backtrace_symbols()
) в обработчике сигналов, не надо.
malloc()
является не безопасный асинхронный сигнал Вызов его внутри обработчика сигнала, пока другой код находится в malloc()
скорее всего заблокирует вас (как это было здесь).
использование backtrace_symbols_fd()
вместо этого он не будет вызывать malloc()
Память, указанная в строке, может быть повреждена / освобождена и т. Д.
Эта проблема могла существовать раньше и проявляться сейчас из-за изменений в компиляторе / других библиотеках.
Запустите ваш код с помощью valgrind для устранения проблем с повреждением памяти.