2013-10-22 64 views
1

我试图测试xxhash函数。于是我写了一个简单的程序,生成UUID并将其传递给XXH32函数。下面是我的程序:uuid_generate_random当发生1000万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软件包。当我打开core文件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。您可以从here下载核心文件。

[更新]

基于@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 { 

新的核心文件可以从here下载。为什么这会发生?是否有任何操作系统级别限制?这是从堆栈而不是堆分配内存吗?因为unsigned int *hash = (unsigned int *) malloc(sizeof(unsigned int) * 10000000);没有问题。

+0

什么是'XXH32'?顺便说一句,uuid需要32个字节而不是36. – alk

+0

@alk'uuid_unparse'手册页说:uuid_unparse函数将提供的UUID从二进制表示转换为一个36字节的字符串(加上尾部的'\ 0')形式1b4e28ba-2fa1-11d2-883f-0016d3cca427。 'XXH32'是'xxhash'库中的散列函数。我用'UUID'的字符串表示来喂它。 –

+0

呃,是的,你是对的,我忘了破折号。 – alk

回答

1

我想我钉了它。使用malloc()从堆而不是堆栈动态分配内存。我记得过去面临同样的问题。