2012-04-02 35 views
0

OS /環境信息:Valgrind的使我的所有程序的線程睡眠

[email protected]:~$ lsb_release -a 
No LSB modules are available. 
Distributor ID: Ubuntu 
Description: Ubuntu 11.10 
Release:  11.10 
Codename:  oneiric 
[email protected]:~$ 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 

我工作的一個服務器端項目。

我有幾個問題,這個項目:

  1. boost::weak_ptr<T>.lock() Crashes with a SIGSEGV Segmentation Fault
  2. 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 

所以任何想法?謝謝。

彼得

+0

目前尚不清楚爲什麼這是一個問題。你並沒有多告訴我們你的代碼,但很可能所有的線程都在等待工作。你可以使用'gdb'來附加進程並查看線程正在做什麼。 'thread apply all where'命令可能有幫助。 – 2012-04-02 18:08:53

回答

0

正如David Schwartz說,

目前還不清楚爲什麼這是一個問題

他是正確的。我做了一個簡單的測試:我創建了另一個單獨的客戶端,並讓它連接到服務器,發送命令到服務器,並從服務器獲得響應。所以服務器狀況良好。

這意味着,負載測試有一些問題。它只是停止發送客戶端命令到服務器。

我的一位同事在Java中編寫了這個部分(而我的服務器是用C++/Boost編寫的)。我需要看他的代碼。這將花費很多時間。

一旦我從加載測試代碼中找到了某些東西,我會回到這裏。

+0

'我需要看他的代碼。這將需要很多時間' - 我生活的故事:(( – 2012-04-02 20:10:29