51

最近、PHP から次のエラーが発生しました。

WARNING: [pool www] child 42475 said into stderr: "*** glibc detected *** php-fpm: pool www: corrupted double-linked list: 0x00000000013fe680 ***"

私はこの問題にあまり悩まされておらず、修正することにあまり興味がありません。しかし、このエラー「破損した二重リンクリスト」が実際に何を意味するのかを理解することに非常に興味があります。これまでに見たことがないからです。二重リンク リストとは何かを知っていると思いますが、このエラーを引き起こすプログラムを作成できませんでした。

コンパイルして実行すると、glibc が「壊れた二重リンク リスト」と表示するコードの短いスニペットを提供してもらえますか?

4

6 に答える 6

70

私は自分の質問に対する答えを自分で見つけました:)

私が理解していなかったのは、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 がこの構造体が二重リンクリストであることをどのように認識できるかを理解しています:)

于 2013-02-18T07:23:20.140 に答える
5

ここで解決策を探している人にとっては、C++ で同様の問題が発生しました: malloc(): smallbin doublelinked list壊れた:

これは、関数が本来の値を返さないことが原因でした。

std::vector<Object> generateStuff(std::vector<Object>& target> {
  std::vector<Object> returnValue;
  editStuff(target);
  // RETURN MISSING
}

結局、なぜこれがコンパイルできたのかわかりません。おそらくそれについての警告がありました。

于 2013-11-04T07:03:44.107 に答える