SylixOS異常調試的手段

1 適用範圍

  本文檔適用於但願瞭解當前SylixOS的調試手段的工程師。linux

2 cdump 系統/應用異常調試手段

2.1 cdump簡介shell

  cdump 是SylixOS系統下的shell命令,用於系統/應用崩潰的信息記錄。cdump能夠將內核保存在堆中的異常信息顯示出來並清空內核堆中的異常信息或者保存下來。express

2.2 cdump的使用方法

  當系統/應用程序發生異常時,能夠在系統命令行下輸入 cdump -s 保存異常信息,異常信息將保存在/var/log/cdump/ 目錄下,如圖 2.1。服務器

                                                                                      圖 2.1保存異常信息網絡

  將異常信息顯示出來使用cdump -c命令,如圖 2.2。tcp

                                                                                      圖 2.2顯示異常信息函數

2.3 cdump注意事項工具

  1. 應用崩潰未致使系統重啓,能夠經過cdump保存和顯示系統/應用異常信息。
  2. 當出現異常形成shell沒法使用的狀況下,能夠掉電重啓系統,啓動後經過cdump -s和cdump -c 保存/顯示異常信息。
  3. 當系統因爲異常形成崩潰重啓,通常狀況下沒法使用cdump命令保存/顯示異常信息。
  4. 若是出現系統崩潰重啓且沒法用cdump顯示異常,優先考慮棧溢出的可能,使用shstack new stack size 調大棧空間後,從新運行。

3 上下文打印信號

  SylixOS下能夠經過kill 命令打印進程和線程上下文,在 shell 命令行下輸入ts命令,查看該進程或線程的pid/tid 值,再在shell命令行下輸入 kill -n -47 [pid/tid],如圖 3.1 所示;post

                                                                                   圖3.1 上下文打印信號優化

 能夠經過進程上下文中信息比對objdump反彙編出來彙編代碼,分析程序。

4 objdump反彙編操做

  在IDE下能夠利用IDE安裝目錄下的 xxx-objdump.exe 工具對可執行文件進行反彙編操做;下面以elf文件test爲例詳細介紹:

  1. objdump -f test :顯示test的文件頭信息;
  2. objdump -d test :反彙編test中的須要執行指令的那些section;
  3. objdump -D test :與-d相似,但反彙編test中的全部section;
  4. objdump -h test :顯示test的Section Header信息;
  5. objdump -x test :顯示test的所有Header信息;
  6. objdump -s test :除了顯示test的所有Header信息,還顯示他們對應的十六進制文件代碼;
  7. 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 能夠在設備或模擬器上在線調試應用程序,目前有如下幾種方式:

  1. 一鍵推送調試;
  2. 手動啓動調式;
  3. 經過串口調試;
  4. 動態庫調試;
  5. Attach 到進程;
  6. Non-stop 模式;
  7. 內核調試。

具體調試方法能夠參考《RealEvo-IDE使用手冊》第五章內容以及《RealEvo-Simulator使用手冊》第2.8節、2.9節。

7 部分shell調試

  能夠在系統命令行下,查看系統/應用程序狀態,有以下幾種:

  1. 內存泄漏檢查:leakchk、leakchkstart、leakchkstop
  2. 顯示系統當前的內存信息:free;
  3. 查看線程和中斷堆棧的使用狀況:ss
  4. 查看cpu的使用率:top;
  5. 查看系統中斷向量表信息:ints;
  6. 查看系統內核內存堆與系統內存堆使用狀況:mems
  7. 顯示或設置當前內核日誌打印等級:loglevel
  8. 顯示或者設置shell任務堆棧大小:shstack
  9. 查看網絡狀態:netstat
  10. 顯示當前操做系統異常處理統計信息:aborts

具體命令的使用能夠參考《SylixOS shell用戶手冊》。

8 打印寄存器內容

  在SylixOS下若是要將寄存器中的值打印出來, 須要移植工具到系統下以及該寄存器地址須映射到系統下,工具以下:

  1. 向寄存器中寫數據 mw [b/w/l] 寄存器地址value 大小(b/w/l分別表示 2字節、4字節、8字節操做的意思)
  2. 讀取寄存器中的數據 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使用手冊》

相關文章
相關標籤/搜索