gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 04:19:57 36 4
gpt4 key购买 nike

我正在处理的代码有很多调用来创建新的字符串和东西。但是最近在将服务器升级到 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?我真的很想得到一个解释。

崩溃发生在这个 like 被调用之后:

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

此行被调用以将简单的 c 字符串转换为 c++ 类型 std::string。但是类(class)是我自己的。由于主要有两个原因,我无法在这里提供完整的代码。1)代码归我公司所有。2) 太他妈长了。

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

最佳答案

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

malloc() 不是 异步信号安全的。当其他代码在 malloc() 中时,在信号处理程序中调用它可能会使您陷入僵局(就像这里所做的那样)。

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

关于c++ - 在死锁 futex 中调用 malloc 和程序时出现段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15477385/

36 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com