SylixOS異常調試的手段
本文檔適用於希望了解當前SylixOS的調試手段的工程師。
2 cdump 系統/應用異常調試手段
2.1 cdump簡介
cdump 是SylixOS系統下的shell命令,用於系統/應用崩潰的信息記錄。cdump可以將內核保存在堆中的異常信息顯示出來並清空內核堆中的異常信息或者保存下來。
2.2 cdump的使用方法
當系統/應用程序發生異常時,可以在系統命令行下輸入 cdump -s 保存異常信息,異常信息將保存在/var/log/cdump/ 目錄下,如圖 2.1。
[點擊並拖拽以移動]
圖 2.1保存異常信息
將異常信息顯示出來使用cdump -c命令,如圖 2.2。
[點擊並拖拽以移動]
圖 2.2顯示異常信息
2.3 cdump註意事項
應用崩潰未導致系統重啟,可以通過cdump保存和顯示系統/應用異常信息。 當出現異常造成shell無法使用的情況下,可以掉電重啟系統,啟動後通過cdump -s和cdump -c 保存/顯示異常信息。 當系統由於異常造成崩潰重啟,一般情況下無法使用cdump命令保存/顯示異常信息。 如果出現系統崩潰重啟且無法用cdump顯示異常,優先考慮棧溢出的可能,使用shstack new stack size 調大棧空間後,重新運行。
3 上下文打印信號
SylixOS下可以通過kill 命令打印進程和線程上下文,在 shell 命令行下輸入ts命令,查看該進程或線程的pid/tid 值,再在shell命令行下輸入 kill -n -47 [pid/tid],如圖 3.1 所示;
圖3.1 上下文打印信號
可以通過進程上下文中信息比對objdump反匯編出來匯編代碼,分析程序。
4 objdump反匯編操作
在IDE下可以利用IDE安裝目錄下的 xxx-objdump.exe 工具對可執行文件進行反匯編操作;下面以elf文件test為例詳細介紹:
objdump -f test :顯示test的文件頭信息;
objdump -d test :反匯編test中的需要執行指令的那些section;
objdump -D test :與-d類似,但反匯編test中的所有section;
objdump -h test :顯示test的Section Header信息;
objdump -x test :顯示test的全部Header信息;
objdump -s test :除了顯示test的全部Header信息,還顯示他們對應的十六進制文件代碼;
objdump -S test :盡可能反匯編出源代碼,尤其當編譯的時候指定了-g這種調試參數時,效果比較明顯。隱含了-d參數。
具體操作流程:
1,將xxx-objdump.exe 工具和可執行文件放在一個文件夾下;
2,在該文件夾下打開cmd,進入該目錄,輸入xxx-objdump.exe [option] 可執行文件 >> 重定向文件,如圖 4.1 所示:
圖 4.1 objdump使用演示
5 死鎖檢測工具的使用
在IDE Device下,Launch Device 後,可以通過 Thread Pending列表查看到發生死鎖的線程,死鎖線程為紅色,如圖 5.1 ;
圖 5.1 IDE死鎖檢測
也可以在shell 命令行下輸入 tp 命令,查看到死鎖線程後綴為 pmutex,如圖 5.2 所示:
圖5.2 shell死鎖檢測
6 RealEvo-IDE調試
使用RealEvo-IDE 可以在設備或模擬器上在線調試應用程序,目前有以下幾種方式:
一鍵推送調試;
手動啟動調式;
通過串口調試;
動態庫調試;
Attach 到進程;
Non-stop 模式;
內核調試。
具體調試方法可以參考《RealEvo-IDE使用手冊》第五章內容以及《RealEvo-Simulator使用手冊》第2.8節、2.9節。
7 部分shell調試
可以在系統命令行下,查看系統/應用程序狀態,有如下幾種:
內存泄漏檢查:leakchk、leakchkstart、leakchkstop;
顯示系統當前的內存信息:free;
查看線程和中斷堆棧的使用情況:ss;
查看cpu的使用率:top;
查看系統中斷向量表信息:ints;
查看系統內核內存堆與系統內存堆使用情況:mems;
顯示或設置當前內核日誌打印等級:loglevel;
顯示或者設置shell任務堆棧大小:shstack;
查看網絡狀態:netstat;
顯示當前操作系統異常處理統計信息:aborts。
具體命令的使用可以參考《SylixOS shell用戶手冊》。
8 打印寄存器內容
在SylixOS下如果要將寄存器中的值打印出來, 需要移植工具到系統下以及該寄存器地址須映射到系統下,工具如下:
向寄存器中寫數據 mw [b/w/l] 寄存器地址value 大小(b/w/l分別表示 2字節、4字節、8字節操作的意思)
讀取寄存器中的數據 md [b/w/l] 寄存器地址 value 大小。
9 調試函數
SylixOS可以將在shell 命令行下輸入系統函數名去調試該函數。
10 Syslog服務器及系統日誌
RealEvo-IDE支持Syslog 服務,具體使用方法可參考《RealEvo-IDE使用手冊》第6.6節;
系統日誌(需要在bsp將kdlog的值改為yes),在系統啟動會在串口下打印內核信息。
11 網絡調試
SylixOS下提供對網絡包的抓取及分析工具tcpdump,tcpdump采用命令行方式,它的命令大致如下,具體的各種使用方法可以在網上參考linux下tcpdump的用法:
tcpdump [ -AbdDefhHIJKlLnNOpqStuUvxX# ] [ -B buffer_size ]
[ -c count ]
[ -C file_size ] [ -G rotate_seconds ] [ -F file ]
[ -i interface ] [ -j tstamp_type ] [ -m module ] [ -M secret ]
[ --number ] [ -Q in|out|inout ]
[ -r file ] [ -V file ] [ -s snaplen ] [ -T type ] [ -w file ]
[ -W filecount ]
[ -y datalinktype ] [ -z postrotate-command ] [ -Z user ]
[ --immediate-mode ]
[ expression ]
參數含義:
-A
以ASCII格式打印出所有分組,通常用來抓取www的網頁數據包數據。
-c
在收到指定的數量的分組後,tcpdump就會停止。
-C
在將一個原始分組寫入文件之前,檢查文件當前的大小是否超過了參數file_size 中指定的大小。如果超過了指定大小,則關閉當前文件,然後在打開一個新的文件。參數 file_size 的單位是兆字節(是1,000,000字節,而不是1,048,576字節)。
-d
將匹配信息包的代碼以人們能夠理解的匯編格式給出。
-dd
將匹配信息包的代碼以c語言程序段的格式給出。
-ddd
將匹配信息包的代碼以十進制的形式給出。
-D
打印出系統中所有可以用tcpdump截包的網絡接口。
-e
在輸出行打印出數據鏈路層的頭部信息,也就是使用數據鏈路層的MAC數據包數據來顯示.
-f
將外部的Internet地址以數字的形式打印出來。
-F
從指定的文件中讀取表達式,忽略命令行中給出的表達式。
-i
指定監聽的網絡接口。
-l
使標準輸出變為緩沖行形式,可以把數據導出到文件。
-L
列出網絡接口的已知數據鏈路。
-b
在數據-鏈路層上選擇協議,包括ip、arp、rarp、ipx都是這一層的。
-n
不把網絡地址轉換成名字。
-nn
不進行端口名稱的轉換。
-N
不輸出主機名中的域名部分。例如,‘nic.ddn.mil‘只輸出’nic‘。
-t
在輸出的每一行不打印時間戳。
-O
不運行分組分組匹配(packet-matching)代碼優化程序。
-P
不將網絡接口設置成混雜模式。
-q
快速輸出。只輸出較少的協議信息。
-r
從指定的文件中讀取包(這些包一般通過-w選項產生)。
-S
將tcp的序列號以絕對值形式輸出,而不是相對值。
-s
從每個分組中讀取最開始的snaplen個字節,而不是默認的68個字節。
-T
將監聽到的包直接解釋為指定的類型的報文,常見的類型有rpc遠程過程調用)和snmp(簡單網絡管理協議)。
-t
不在每一行中輸出時間戳。
-tt
在每一行中輸出非格式化的時間戳
-ttt
輸出本行和前面一行之間的時間差。
-tttt
在每一行中輸出由date處理的默認格式的時間戳。
-v
輸出一個稍微詳細的信息,例如在ip包中可以包括ttl和服務類型的信息。
-vv
輸出詳細的報文信息。
-w
直接將分組寫入文件中,而不是不分析並打印出來。
-X
可以列出16進制以及ASCII的數據包內容,對於監聽數據包內容很有用。
圖 11.1 對網口en1抓取數據包的示列:
[點擊並拖拽以移動]
圖11.1 tcpdum示列
12 參考資料
《RealEvo-IDE使用手冊》
《SylixOS應用開發手冊》
《SylixOS shell用戶手冊》
《RealEvo-Simulator使用手冊》
SylixOS異常調試的手段