Valgrind 使我的程序的所有线程都处于休眠状态
Posted
技术标签:
【中文标题】Valgrind 使我的程序的所有线程都处于休眠状态【英文标题】:Valgrind Makes All of My Program's Threads Sleeping 【发布时间】:2012-04-02 18:01:17 【问题描述】:操作系统/环境信息:
plee@sos-build:~$ lsb_release -a
No LSB modules are available.
Distributor ID: Ubuntu
Description: Ubuntu 11.10
Release: 11.10
Codename: oneiric
plee@sos-build:~$ uname -a
Linux sos-build 3.0.0-12-generic #20-Ubuntu SMP Fri Oct 7 14:56:25 UTC 2011 x86_64 x86_64 x86_64 GNU/Linux
我正在做一个服务器端项目。
我对这个项目有几个问题:
-
boost::weak_ptr<T>.lock() Crashes with a SIGSEGV Segmentation Fault
pthread_mutex_lock __pthread_mutex_lock_full: Assertion failed with robust and 0x4000000
有人建议我使用 Valgrind 来查找问题所在(尤其是第一个问题)。所以我正在使用 Valgrind。
valgrind --leak-check=full --gen-suppressions=all --suppressions=valgrind_suppressions.supp MyServerSideProgram arg1 arg2 arg3 arg4
我的程序有 13 个线程同时运行。一开始,他们工作得很好。不幸的是,经过一定时间后,所有线程都进入睡眠状态。
我用来检查所有线程状态的命令:
top -H -p [MyServerSideProgram's PID]
结果是:
top - 11:54:34 up 46 days, 22:30, 4 users, load average: 0.02, 0.02, 0.05
Tasks: 13 total, 0 running, 13 sleeping, 0 stopped, 0 zombie
Cpu(s): 0.5%us, 0.1%sy, 0.0%ni, 99.2%id, 0.1%wa, 0.0%hi, 0.0%si, 0.0%st
Mem: 9224140k total, 8135872k used, 1088268k free, 294988k buffers
Swap: 9431164k total, 424416k used, 9006748k free, 4973316k cached
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
8744 plee 20 0 1379m 1.2g 6276 S 0 13.7 31:06.81 memcheck-amd64-
8747 plee 20 0 1379m 1.2g 6276 S 0 13.7 31:42.27 memcheck-amd64-
8748 plee 20 0 1379m 1.2g 6276 S 0 13.7 30:58.15 memcheck-amd64-
8749 plee 20 0 1379m 1.2g 6276 S 0 13.7 31:53.62 memcheck-amd64-
8750 plee 20 0 1379m 1.2g 6276 S 0 13.7 30:58.68 memcheck-amd64-
8751 plee 20 0 1379m 1.2g 6276 S 0 13.7 31:31.65 memcheck-amd64-
8752 plee 20 0 1379m 1.2g 6276 S 0 13.7 31:24.63 memcheck-amd64-
8753 plee 20 0 1379m 1.2g 6276 S 0 13.7 32:05.33 memcheck-amd64-
8754 plee 20 0 1379m 1.2g 6276 S 0 13.7 31:52.24 memcheck-amd64-
8755 plee 20 0 1379m 1.2g 6276 S 0 13.7 31:11.69 memcheck-amd64-
8756 plee 20 0 1379m 1.2g 6276 S 0 13.7 31:17.10 memcheck-amd64-
8757 plee 20 0 1379m 1.2g 6276 S 0 13.7 31:54.65 memcheck-amd64-
8758 plee 20 0 1379m 1.2g 6276 S 0 13.7 32:10.67 memcheck-amd64-
我查了man top
:
w: S -- Process Status
The status of the task which can be one of:
'D' = uninterruptible sleep
'R' = running
'S' = sleeping
'T' = traced or stopped
'Z' = zombie
所以有什么想法吗?谢谢。
彼得
【问题讨论】:
尚不清楚为什么这是一个问题。您没有告诉我们太多有关您的代码的信息,但很可能所有线程都在等待工作。您可以使用gdb
附加到进程并查看线程在做什么。 thread apply all where
命令可能会有所帮助。
【参考方案1】:
正如大卫·施瓦茨所说,
不清楚为什么会出现这个问题
他是对的。我做了一个简单的测试:我创建了另一个单独的客户端,让它连接到服务器,向服务器发送命令,它得到了服务器的响应。所以服务器状况良好。
也就是说,负载测试存在一些问题。它只是停止向服务器发送客户端命令。
我的一位同事用 Java 编写了该部分(而我的服务器是用 C++/Boost 编写的)。我需要看看他的代码。这需要很长时间。
一旦我从负载测试代码中找到一些东西,我就会回到这里。
【讨论】:
'我需要看看他的代码。这将需要很多时间'-我的生活故事:((以上是关于Valgrind 使我的程序的所有线程都处于休眠状态的主要内容,如果未能解决你的问题,请参考以下文章