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

5

我有一个用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)

在FBServer.c的第82行,线程调用一个名为process_data的函数,该函数接收来自客户端的数据。如下所示:

在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';

        ...
        ...
    }
}

有人能帮我解释这些错误信息吗?


这是valgrind给你的第一个错误(或输出)吗? - nos
你在哪个平台上?如果你受到打开文件描述符数量的限制,那么这取决于平台。例如,在我的Linux系统上,我可以同时拥有1024个打开文件和128个半开连接。 - zdav
不确定这是否与您的情况有关。但在我的情况下,问题是由于线程耗尽引起的。增加--max-threads可能会解决它(但如果这不是预期的情况,您还应该查看是什么导致了过多的线程)。 - pooya13
2个回答

2
你使用的Valgrind版本是什么?
在源代码中,我只找到了以下评论:
VgTs_WaitSys,“等待系统调用完成”
因此,它似乎表示程序只是在系统调用上阻塞(在您的情况下是recv)。我不确定,但这可能根本不是错误,只是Valgrind产生的一些额外信息。

如果在阻塞recv()之后立即显示消息,则应该与其一致。在这种情况下,它不是错误。 - Torp

0

这是一个不好的回答,但它太长了无法作为评论。

我猜“VgTs_”意思类似于“Valgrind线程”。Valgrind对线程进行序列化。这里有文档链接。这意味着Valgrind需要能够知道每个线程的状态。

它通过说“这是可能的状态”来实现:“可运行”,“等待系统调用”,“让步”等。为了防止命名冲突,前缀为“ValGrind线程状态”。

  • VgTs_WaitSys表示Valgrind知道在系统调用停止阻塞之前无法运行此线程。
  • VgTs_Runnable表示Valgrind知道可以运行该线程。但这并不意味着它正在积极地运行它 - 因为Valgrind只会同时运行一个线程(除非您使用DRDHelgrind作为工具,那么我不知道它会做什么)。
  • VgTs_Yielding我想了解这个过渡状态很有用。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接