[解決済み】「corrupted double-linked list」とはどういう意味ですか?
質問内容
最近、PHPで以下のようなエラーが発生するようになりました。
WARNING: [pool www] child 42475 said into stderr: "*** glibc detected *** php-fpm: pool www: corrupted double-linked list: 0x00000000013fe680 ***"
この問題にはあまり悩まされていませんし、直すことにもあまり興味がありません。 しかし、このエラー 'corrupted double-linked list' が実際に何を意味するのか、今まで見たことがないので非常に興味があります。私はダブルリンクリストが何であるかを知っていると信じていますが、このエラーを引き起こすプログラムを作成することができませんでした。
誰か、コンパイルして実行したときに glibc が 'corrupted double-linked list' と言うようなコードの短いスニペットを提供してくれませんか?
解決方法を教えてください。
私自身、質問の答えが見つかりました:)
私が理解できなかったのは、glibc が Segfault と破損したダブルリンクリストをどのように区別するかということです。私の理解によれば、glibc から見れば、これらは同じものに見えるはずだからです。 なぜなら、もし私が自分のプログラムの中でダブルリンクリストを実装したら、glibcはそれが他の構造体ではなくダブルリンクリストであることをどうやって知ることができるでしょうか?おそらくできないでしょうから、混乱したわけです。
さて、glibcのコード内のmalloc/malloc.cを見てみると、以下のようになっています。
1543 /* Take a chunk off a bin list */
1544 #define unlink(P, BK, FD) { \
1545 FD = P->fd; \
1546 BK = P->bk; \
1547 if (__builtin_expect (FD->bk != P || BK->fd != P, 0)) \
1548 malloc_printerr (check_action, "corrupted double-linked list", P); \
1549 else { \
1550 FD->bk = BK; \
1551 BK->fd = FD; \
これで急に納得がいきましたね。glibcがこれがダブルリンクリストであることを知ることができるのは、リストがglibc自身の一部であるからです。私は、glibcが何らかのプログラミングでダブルリンクリストを構築していることを検知できると思っていたので混乱していたのですが、その仕組みは理解できないでしょう。しかし、もしこのダブルリンクリストがglibc自身の一部であるならば、もちろんダブルリンクリストであることを知ることができるのです。
何がこのエラーの引き金になったのか、まだわかりません。しかし、少なくとも、破損したダブルリンクリストとSegfaultの違い、そして、この構造体がダブルリンクリストであるはずだとglibcが知ることができる方法については理解できました:)
関連
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン