[產品介紹] NSK multithread debug

作者/黃俊源

作者簡歷 作者現職凌群電腦NSK服務處總工程師,主要負責台灣證券交易所交易系統與維運系統、NonStop系統維運服務。專長為HPE NonStop系統、系統整合、系統網路監控管理。 前言 NonStop 從H06.21或J06.10之後版本及L系列的版本,OSS便支援POSIX User Thread,OSS process可以借此啟動multithread作程式的處理與控制,基本上每個thread具備自己的register及execution stack。以往針對OSS multithread process作debug時,無法於過程中隨意切換不同thread的運作,往往造成程式在測試除錯過程中,需要加入額外訊息紀錄以供判斷及分析;目前從L19.08之後版本,native inspect針對OSS multithread新增關於multithread process的除錯機制,本文件將針對此次新增功能作說明。 功能說明 於L19.08之後,native inspect新增下列的指令與功能,以便用於OSS multithread process的環境;這部分是用於online process debug以及saveabend file除錯,新增功能包含thread切換設定、thread資訊查看、thread指令派送、thread搜尋,不過現行針對這些新增功能,僅支援於TNS/X系統。 下列將針對此次新增功能說明彙整如下:
  • thread thread-id:切換目前所在thread位置。如下列範例: (xInspect 0,766):thread 2 [Switching to thread 2 (process 766)] #0 0xfffffffff12957fd in GTHREAD_START_ () 註:切換到thread 2作為當前所在thread位置。
  • info threads:查看process所建立的所有thread。如下列範例: (xInspect 0,766):info thread Id Target Id Frame * 1 process 766 thread 1 main (argc=1, argv=0x8001000) at /home/nsadi/./rs_server.c:14 2 process 766 thread 2 0xfffffffff12957fd in GTHREAD_START_ () 3 process 766 thread 3 0xfffffffff12957fd in GTHREAD_START_ () 註:Id為thread library所指派的thread TID。 Target Id為process ID加上thread TID。 Frame對應當下所在function及所在source位置。
  • thread apply:針對指定的thread或是所有thread執行特定指令。如下列範例: (xInspect 0,766):thread apply all bt Thread 3 (process 766): #0 0xfffffffff12957fd in GTHREAD_START_ () Thread 2 (process 766): #0 0xfffffffff12957fd in GTHREAD_START_ () Thread 1 (process 766): #0 main (argc=1, argv=0x8001000) at /home/nsadi/./rs_server.c:14 #1 0x70000ba0 in _MAIN () at \BLPROD.$RTAL.T8432ACK.CMAIN64C:52 註:針對每個thread發送backtrace指令。
  • thread name:針對目前所在thread作命名。主要將於info thread中顯示作區隔查看,如下列範例: (xInspect 0,1177):thread name test (xInspect 0,1177):info thread Id Target Id Frame * 1 process 1177 thread 1 "test" main (argc=1, argv=0x8001000) at /home/nsadi/./rs_server.c:14 2 process 1177 thread 2 0xfffffffff12957fd in GTHREAD_START_ () 3 process 1177 thread 3 0xfffffffff12957fd in GTHREAD_START_ ()
  • thread find:搜尋滿足條件的thread。主要依照thread ID或是name作搜尋,列出滿足的thread資訊,如下列範例: (xInspect 0,1177):thread find test Thread 1 has name 'test' (xInspect 0,1177):thread find 1177 Thread 1 has target id 'process 1177 thread 1' Thread 2 has target id 'process 1177 thread 2' Thread 3 has target id 'process 1177 thread 3'
  • 針對thread指定breakpoint功能。藉由thread指令切換不同thread,針對各thread底下設定breakpoint位置;如下列範例: (xInspect 0,1177):thread 1 [Switching to thread 1 (process 1177)] (xInspect 0,1177):l 9 10 char *client_message ; 11 char *msg_ptr ; 12 13 *14 int snd_recv_buffer_size = DEFAULT_SEND_RECV_SIZE ; 15 uint16_t port_number = PORT_NUMBER ; 16 17 18 while ((c = getopt (argc, argv, "a:b:p:h")) != -1) { 19 switch (c) { 20 case 'b': 21 snd_recv_buffer_size = atoi(optarg) ; 22 if ((snd_recv_buffer_size < DEFAULT_MSG_SIZE) && (snd_recv_buffer_size > MAX_MESSAGE_SIZE)) { 23 printf("rs_server: send/recv sockopt size not within legal bounds %d..%d \n", 24 (int)DEFAULT_MSG_SIZE,(int)MAX_MESSAGE_SIZE) ; 25 exit (-1) ; 26 } 27 28 break ; (xInspect 0,1177):b 21 Breakpoint 2 at 0x70000df0: file /home/nsadi/./rs_server.c, line 21. (xInspect 0,1177):info break Num Type Disp Enb Glb Address What 2 breakpoint keep y n 0x0000000070000df0 in main at /home/nsadi/./rs_server.c: 21
支援版本資訊 TNS/X Native Inspect(T0903L02^AAI),適用於L15.02.00~L20.05.00的RVU版本,此版本於2019年9月推出。為現行最新版本。 結論 隨著近期NonStop於OSS陸續支援新增功能,因此用戶藉由OSS環境開發所需應用系統的機會亦隨之增加,因此以thread方式進行應用程式的開發機率亦提升不少,藉由此次native inspect推出的新增功能,對於程式開發階段乃至於後續維護的除錯工作,提供更為便利的操作。藉由thread切換控制,更便於程式除錯時,取得較佳的主控權與設定。 參考資料 1.Interactive upgrade guide 2 866489-001 2.Native Inspect Manual P20528-001