Что означает ошибка VgTs_WaitSys в Valgrind? - PullRequest
4 голосов
/ 09 августа 2011

У меня есть сервер, написанный на C, который порождает новый поток при каждом подключении нового клиента.Чтобы протестировать мой сервер, я написал скрипт, имитирующий 500 клиентов.Сервер обрабатывает первые пару сотен клиентов, и в конце я получаю следующую ошибку от Valgrind:

Thread 456: status = VgTs_WaitSys
==4182==    at 0x4E383EC: recv (recv.c:34)
==4182==    by 0x4017F1: process_data (socket2.h:45)
==4182==    by 0x40195E: thread (FBServer.c:82)
==4182==    by 0x4E30A03: start_thread (pthread_create.c:300)
==4182==    by 0x532DD4C: clone (clone.S:112)

Thread 457: status = VgTs_WaitSys
==4182==    at 0x4E383EC: recv (recv.c:34)
==4182==    by 0x4017F1: process_data (socket2.h:45)
==4182==    by 0x40195E: thread (FBServer.c:82)
==4182==    by 0x4E30A03: start_thread (pthread_create.c:300)
==4182==    by 0x532DD4C: clone (clone.S:112)

...

Thread 499: status = VgTs_WaitSys
==4182==    at 0x4E383EC: recv (recv.c:34)
==4182==    by 0x4017F1: process_data (socket2.h:45)
==4182==    by 0x40195E: thread (FBServer.c:82)
==4182==    by 0x4E30A03: start_thread (pthread_create.c:300)
==4182==    by 0x532DD4C: clone (clone.S:112)

В строке 82 в FBServer.c поток вызывает функцию с именем process_data, которая получает данные изклиент.Функция process_data показана ниже:

void process_data(int clientSock)
{
    size_t n;
    char jstring[MAX_LEN + 1];
    int bytes_received_so_far = 0;
    int bytes_count;
    char *buf = NULL;

    while(bytes_count = recv(clientSock, jstring, MAX_LEN, 0))
    {
        if(bytes_count <= 0)
        {
            close(clientSock);
            pthread_exit(NULL);
        }

        printf("Bytes received = %d\n", bytes_count);                           
        jstring[bytes_count] = '\0';

        ...
        ...
    }
}

Может кто-нибудь помочь мне в интерпретации сообщений об ошибках.

1 Ответ

1 голос
/ 09 августа 2011

Какую версию Valgrind вы используете?

Единственный комментарий, который я мог найти в источнике, был:

VgTs_WaitSys, /* waiting for a syscall to complete */

Похоже, это означает, что программа просто блокирует системный вызов (recv в вашем случае). Я не уверен, но это может и не быть ошибкой, просто какая-то дополнительная информация, выдвинутая Valgrind.

...