0

malloc() ルーチン内でセグメンテーション違反が発生しています。gdb からのスタック トレースは次のとおりです。

#0  0x00007ffff787e882 in ?? () from /lib/x86_64-linux-gnu/libc.so.6
#1  0x00007ffff787fec6 in ?? () from /lib/x86_64-linux-gnu/libc.so.6
#2  0x00007ffff7882a45 in malloc () from /lib/x86_64-linux-gnu/libc.so.6
#3  0x0000000000403ab0 in xmalloc (size=1024) at global.c:14
#4  0x00000000004020fb in processConnectionQueue (arguments=0x60a4e0)
    at connection.c:117
#5  0x00007ffff7bc4e9a in start_thread ()
   from /lib/x86_64-linux-gnu/libpthread.so.0
#6  0x00007ffff78f24bd in clone () from /lib/x86_64-linux-gnu/libc.so.6
#7  0x0000000000000000 in ?? ()

どうしたの?malloc() が segfault になる原因は何ですか?

編集: xmalloc() のコードは次のとおりです。これは非常に標準的で、スタック トレースからわかるように、1024 のサイズで malloc を呼び出しています。

void* xmalloc(size_t size)
{
    void* result = malloc(size);
    if(!result)
    {
        if(!size)
        {
            result = malloc(1);
        }
        if(!result)
        {
            fprintf(stderr, "Error allocating memory of size %zu\n", size);
            exit(-1);
        }
    }
    return result;
}

また、connection.c の 117 行目:

        item->readBuffer = xmalloc(kInitialPacketBufferSize);
4

3 に答える 3

6

コードの他の場所で、割り当て外のメモリにアクセスするエラーの影響が見られる可能性が最も高いです。運が良ければ、割り当てを追跡するために malloc が使用する内部値の一部にコードが触れる可能性があります。

可能性がある場合は、コードを libefence などの割り当てチェッカーにリンクしてみて、これを使用して実際の問題を特定してください。

于 2012-10-12T09:38:55.507 に答える
0

これには、少なくとも 3 つの基本的な原因があります。

  1. malloc() によって返されたアイテムをオーバーランし、その開始前または終了後に何かを書きました。

  2. 何かを 2 回解放しましたが、これはある意味で特殊なケースです。

  3. malloc() の結果ではないものを解放しました。

これらのアクションのいずれかが malloc)) ヒープを破壊し、誤動作を引き起こします。

于 2012-10-12T10:18:19.097 に答える
0

回線を確認できますか

#3  0x0000000000403ab0 in xmalloc (size=1024) at global.c:14

size=1024 の global.c。また、 Weggeが述べたように、いくつかのツールを使用して、この segfault を再評価する問題を検出することもできます。

于 2012-10-12T09:44:41.027 に答える