技術分享
[產品介紹] 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