-1

C (Ubuntu 10.10) で UDP サーバーを作成しました。サーバーは非常に大きく、その一部は Strtok_r() を使用していくつかの文字列処理を行います [私は以前にこの関数を正常に使用しました]。サーバーが初めて実行されるとき、サーバーはクライアントからのデータを正しく処理します。しかし、別のクライアントが来て何らかのデータを送信すると、プログラムは次のメッセージでクラッシュします。

MappingServer: malloc.c:3096: sYSMALLOc: Assertion `(old_top == (((mbinptr) (((char *) &((av)->bins[((1) - 1) * 2])) - __builtin_offsetof (struct malloc_chunk, fd)))) && old_size == 0) || ((unsigned long) (old_size) >= (unsigned long)((((__builtin_offsetof (struct malloc_chunk, fd_nextsize))+((2 * (sizeof(size_t))) - 1)) & ~((2 * (sizeof(size_t))) - 1))) && ((old_top)->size & 0x1) && ((unsigned long)old_end & pagemask) == 0)' failed.
Aborted 

strtok_r() 関数をコメントアウトすると、すべてが正常に機能します (クライアントがいくつ来ても!)。問題の原因となっているコードは次のとおりです。

char delims[] = "/"; 
char* token = NULL; 
char* separated_token[4]; 
int i,j; 
char* last; 
j = 0; 
token = strtok_r( input_string, delims, &last );
       while( token != NULL)
       {
        separated_token[j] = malloc(strlen(token) + 1);
        strcpy(separated_token[j],token);
        printf("%s  ", separated_token[j] );

        j++;
        token = strtok_r( NULL, delims, &last );
        } 

私が理解できる限り、コードは問題なく、最初のクライアントに対しては完全に機能します。少し混乱しています。このエラーはどういう意味ですか? strtok() を試してみましたが、結果は同じです。

4

1 に答える 1

1
 malloc.c:3096: sYSMALLOc: Assertion

これは、ヒープ内の内部 malloc 構造が壊れていることを意味します。でサーバーを実行して、valgrindヒープ使用エラーやメモリ破損を見つけてください。

free();を実行するコードがないため、追加したコードを分析するのは困難です。配列のサイズseparated_token[]は不明です。処理後にすべてのトークンを free() しますか? separated_token[]配列自体に十分な要素を割り当てていますか? j2 番目のリクエストのトークン化を開始する前に、カウンターをゼロにリセットしますか?

于 2011-06-26T14:23:35.620 に答える