檢視某個程序的CPU佔用(如何檢視執行緒使用情況)

文章下方附學習資源 請自主領取

大家好,我是雜燴君。

嵌入式Linux開發中,有時候為了定位問題,需要檢視某個程序的各個執行緒的執行情況。

例子

multi_thread.c:

左右滑動檢視全部程式碼>>>

#define _GNU_SOURCE #include#include#include#include// 執行緒名稱最大長度 #define APP_THREAD_NAME_MAX_LEN     32 // 執行緒索引 typedef enum _app_thread_index {     APP_THREAD_INDEX_TEST0,     APP_THREAD_INDEX_TEST1,     APP_THREAD_INDEX_TEST2,     APP_THREAD_INDEX_TEST3,     APP_THREAD_INDEX_TEST4,     APP_THREAD_INDEX_TEST5,     APP_THREAD_INDEX_MAX }app_thread_index_e; // 執行緒入口函式指標型別 typedef void *(*p_thread_fun)(void *param); // 執行緒資料表 typedef struct _app_thread {     pthread_t thread_handle;     p_thread_fun thread_entry;     char name[APP_THREAD_NAME_MAX_LEN]; }app_thread_s; static void *test0_thread_entry(void *param); static void *test1_thread_entry(void *param); static void *test2_thread_entry(void *param); static void *test3_thread_entry(void *param); static void *test4_thread_entry(void *param); static void *test5_thread_entry(void *param); // 執行緒表 app_thread_s s_app_thread_table[APP_THREAD_INDEX_MAX] = {     {0, test0_thread_entry, "test0_thread"},     {0, test1_thread_entry, "test1_thread"},     {0, test2_thread_entry, "test2_thread"},     {0, test3_thread_entry, "test3_thread"},     {0, test4_thread_entry, "test4_thread"},     {0, test5_thread_entry, "test5_thread"} }; static void *test0_thread_entry(void *param) {     printf("test0_thread running.../n");     while (1)     {         usleep(2 * 1000);     }          return NULL; } static void *test1_thread_entry(void *param) {     printf("test1_thread running.../n");     while (1)     {         usleep(2 * 1000);     }          return NULL; } static void *test2_thread_entry(void *param) {     printf("test2_thread running.../n");     while (1)     {         usleep(2 * 1000);     }          return NULL; } static void *test3_thread_entry(void *param) {     printf("test3_thread running.../n");     while (1)     {         usleep(2 * 1000);     }          return NULL; } static void *test4_thread_entry(void *param) {     printf("test4_thread running.../n");     while (1)     {         usleep(2 * 1000);     }          return NULL; } static void *test5_thread_entry(void *param) {     printf("test5_thread running.../n");     while (1)     {         usleep(2 * 1000);     }          return NULL; }; static int create_all_app_thread(void) {     int ret = 0;     for (int i = 0; i < APP_THREAD_INDEX_MAX; i  )     {         ret = pthread_create(&s_app_thread_table[i].thread_handle, NULL, s_app_thread_table[i].thread_entry, NULL);         if (0 != ret)         {             printf("%s thread create error! thread_id = %ld/n", s_app_thread_table[i].name, s_app_thread_table[i].thread_handle);             return ret;         }         else         {             printf("%s thread create success! thread_id = %ld/n", s_app_thread_table[i].name, s_app_thread_table[i].thread_handle);             pthread_setname_np(s_app_thread_table[i].thread_handle, s_app_thread_table[i].name);         }         pthread_detach(s_app_thread_table[i].thread_handle);     }     return ret; } int main(int argc, char **argv) {      create_all_app_thread();          while (1)     {         usleep(2 * 1000);     }     return 0; }

嵌入式物聯網需要學的東西真的非常多,千萬不要學錯了路線和內容,導致工資要不上去!

無償分享大家一個資料包,差不多150多G。裡面學習內容、面經、專案都比較新也比較全!某魚上買估計至少要好幾十。

點選這裡找小助理0元領取:嵌入式物聯網學習資料(頭條)

我們可以通過top命令來檢視。要在top輸出中開啟執行緒檢視,請呼叫top命令的“-H”選項,該選項會列出所有Linux執行緒。

這裡我們指定檢視multi_thread程序的各執行緒執行情況,命令:

top -H -p `pidof multi_thread`

注意:

這裡的 `號並不是單引號!!!

這裡的 `號並不是單引號!!!

這裡的 `號並不是單引號!!!

這個符號在鍵盤上感嘆號!鍵的左邊。

我們先執行程式,再使用top命令檢視,如:

注意,我們建立執行緒的時候需要使用 pthread_setname_np 函式設定執行緒的名字,否則top -H顯示不出來具體的執行緒。

假如我們把上例中的pthread_setname_np遮蔽掉,結果如:

可見,不呼叫pthread_setname_np設定執行緒名稱的話,top -H檢視得到的各執行緒名稱就是程序名。

原文作者:ZhengNL

原文來源:嵌入式大雜燴

原文連結:
       https://mp.weixin.qq.com/s/DURT5jhAWWFhsaHHB_qi4w