1

私が取り組んでいるコードには、新しい文字列などを作成するための呼び出しがたくさんあります..しかし、最近、サーバーを 12.10 Ubuntu にアップグレードした後、いくつかの問題に直面し始めました。一部の子プロセスがfutex. それで、私は長い間GDB実行中のプロセスに接続して、次のログを見つけましたfutexbacktrace

#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 に変換するために呼び出されます。しかし、クラスは私のものです。主に 2 つの理由により、ここでコード全体を示すことはできません。1) コードは私の会社が所有しています。2) めちゃくちゃ長い。

本当にごめんなさい。なぜそれがクラッシュしmallocてデッドロックが発生するのかについての説明が必要です。なぜなら、以前のロックが解放されるのを待っているからですsighandlermalloc

4

2 に答える 2

1

シグナル ハンドラでmalloc()(間接的に、 を介して)呼び出している可能性があるようです。backtrace_symbols()

malloc()非同期シグナルセーフではありません。他のコードが入っているときにシグナルハンドラー内で呼び出すと、malloc()デッドロックが発生する可能性があります (ここで行ったように)。

代わりに使用してくださいbacktrace_symbols_fd()。呼び出されませんmalloc()

于 2013-03-18T13:03:38.180 に答える
1

文字列が指すメモリが破損/解放されている可能性があります..

この問題は以前にもあった可能性があり、コンパイラやその他のライブラリが変更されたため、現在顕在化しています。

コードを valgrind で実行して、メモリ破損の問題をデバッグします。

于 2013-03-18T13:10:37.813 に答える