Valgrind 中的错误 VgTs_WaitSys 是什么意思?

Pro*_*mer 5 c multithreading valgrind

我有一个用 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)
Run Code Online (Sandbox Code Playgroud)

在 FBServer.c 的第 82 行,线程调用一个名为 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';

        ...
        ...
    }
}
Run Code Online (Sandbox Code Playgroud)

有人可以帮助我解释错误消息。

zda*_*dav 2

您使用什么版本的 Valgrind?

关于我在来源中找到的唯一评论是:

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

所以它似乎表明该程序只是阻塞在系统调用上(在您的情况下是recv)。我不确定,但这可能根本不是一个错误,只是 Valgrind 踢出的一些额外信息。