1

xxhash関数をテストしようとしていました。XXH32そこで、UUID を生成して関数に渡す簡単なプログラムを作成しました。これが私のプログラムです:

#define UUID_LEN 36

int main(int argc, char **argv)
{
    uuid_t id;
    char cid[UUID_LEN + 1];

    int hash_count = atoi(argv[1]);
    unsigned int hash[hash_count];

    for(int i = 0;i < hash_count;i++) {
        uuid_generate_random(id);
        uuid_unparse(id, cid);

        hash[i] = XXH32(cid, UUID_LEN, time(NULL));

        uuid_clear(id);
    }

    return 0;
}

ハッシュ生成数を引数( ./main 100)として渡します。プログラムは正常に動作しますが、100 万を超えると次のように表示されますSegmentation fault (core dumped)。すべての debuginfo パッケージをインストールしました。コアファイルを開くと、次のgdbように表示されます。

Reading symbols from /home/m.azimi/projects/testtommy/main...done.
[New LWP 8117]
Core was generated by `./main 10000000'.
Program terminated with signal 11, Segmentation fault.
#0  0x00000000004008e0 in main (argc=2, argv=0x7fffe19da598) at main.c:19
19          uuid_generate_random(id);

uuid_generate役に立たないもので試しました。完全に更新されたパッケージで fedora 19 を使用しています。ここからコアファイルをダウンロードできます。

[アップデート]

私が変更した@Tarikコメントに基づいて、hash[i % 10000] = XXH32(cid, UUID_LEN, time(NULL));現在は正常に動作しています。また、生成された整数ハッシュのみを保存しています。したがって、メモリ使用量は 10,000,000 * 4 バイト = 40MB です。次に、プログラムを次のように変更しました。

int main(int argc, char **argv)
{
    /* allocate 10 million 4byte chunk = 40MB */
    unsigned int hash[10000000];

    return 0;
}

これもコアでクラッシュします:

[New LWP 13593]
Core was generated by `./main'.
Program terminated with signal 11, Segmentation fault.
#0  0x000000000040068b in main (argc=<error reading variable: Cannot access memory at address 0x7fff244a388c>, 
    argv=<error reading variable: Cannot access memory at address 0x7fff244a3880>) at main.c:9
9   {

新しいコア ファイルは、ここからダウンロードできます。なぜこれが起こるべきですか?OSレベルの制限はありますか? これは、ヒープではなくスタックからメモリを割り当てていますか? 問題なく動作しますのでunsigned int *hash = (unsigned int *) malloc(sizeof(unsigned int) * 10000000);

4

1 に答える 1

1

私はそれを釘付けにしたと思います。malloc() を使用して、スタックではなくヒープからメモリを動的に割り当てます。過去に同じ問題に直面したことを覚えています。

于 2013-10-22T12:42:51.930 に答える