1. ホーム
  2. memory-management

[解決済み】「corrupted double-linked list」とはどういう意味ですか?

2022-01-28 20:22:39

質問内容

最近、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が知ることができる方法については理解できました:)