vxworks 调式
1,boot操作相關
串口命令行重啟回車進入boot:
查看boot版本:v
更新: c??? @
升級設備: w
運行: g
?
2, 代碼:
2.1添加命令行:
??? DEFUN,
??? install_element
?
2.2 VxWorks使用
??? i:查看任務;
??? memShow:查看內存情況;
?? tt:查看堆棧信息;
?
?
3,測試
3.1 信令跟蹤測試步驟:
??? 設置局VLAN,指定上聯端口,VID;
??? 設置NGN及上聯數據;
??? 連接上聯端口到MGC服務器,服務器腳本設置與NGN中設置一致;
??? 設置ONU語音帶寬;
??? 設置ONU FX端口,電話號碼,VID;
??? 打開信令跟蹤開關(地址為ONU IP, H.248端口為2944)
?
4,測試工作步驟
先檢查設備連線情況;
再檢查設備版本是否為最新;
檢查主備盤情況及IP地址等信息;
?
5,編程問題
運行出現memPart Free ,invalid block, 在網上搜表明是一個非法的內存塊導致任務掛起。
這是一篇很詳細的文章:
http://blog.rogerz.cn/archives/685
VxWorks中如果稍有不慎,就可能導致task suspend,如果運氣好,shell沒有被掛起,則可以通過系統的一些命令追蹤一下掛起的原因。其中用到的主要命令是i、tt、ti、d等。
?
首先從出錯信息開始:
0xfc8125b8 (t_Lcd): memPartFree: invalid block 0xfdfc6f38 in partition 0xfe508894.
由于memPartFree了一個非法的內存塊,導致了任務掛起,我們需要確定到底是哪條語句導致了這個異常的產生,可能是什么原因引起的。
首先,需要通過“i”命令察看任務狀態:
-> i
NAME ENTRY TID PRI STATUS PC SP ERRNO DELAY ---------- ------------ -------- --- ---------- -------- -------- ------- ----- tExcTask excTask fdffec80 0 PEND fe3c5f50 fdffeb60 3006b 0 tLogTask logTask fdffc298 0 PEND fe3c5f50 fdffc188 0 0 tShell shell fdf5fa48 1 READY fe1f3afc fdf5f628 0 0 …… t_Lcd fe392a30 fc8125b8 100 SUSPEND fe1f24b0 fc8120b8 d0003 0 ……可以看到任務t_Lcd的狀態為SUSPEND,即被掛起的狀態。其他各項的含義都比較清楚,ENTRY是任務的入口函數,如果沒有symbol,則直接顯示地址,TID是任務的ID號,一般用任務的棧底地址表示,PC是當前的指令位置,SP是當前棧頂位置。
然后通過”tt”來追溯函數調用過程:
-> tt "t_Lcd" fe3c14f4 vxTaskEntry +68 : fe392a30 () fe392b48 initLcdComponent+2e8: fe392bdc () fe392bec initLcdComponent+38c: fe392bfc () fe39333c initLcdComponent+adc: lcdShowPassWord () fe398590 lcdShowPassWord+84 : saveModifiedSetting () fe3a3790 saveModifiedSetting+220: saveSettingValue (1) fe1fd6d0 saveSettingValue+148: fe1fc428 (0, 5, ffffffff) fe1fc888 getDeviceSettingValue+64c: fclose () fe1aab48 fclose +ec : free () fe1bb7d4 free +1c : memPartFree () fe1bb2dc memPartFree +148: taskSuspend ()我們可以了解到函數的調用過程,vxTaskEntry()?->fe392a30()->fe392bdc ()->fe392bfc ()->lcdShowPassWord ()->saveModifiedSetting ()->saveSettingValue (1)->fe1fc428 (0, 5, ffffffff)->fclose ()->free ()->memPartFree ()->taskSuspend ()。其他相關信息:第一欄是發生跳轉(即函數調用)后的返回地址,稍后會作詳細解釋,第二欄是離返回地址最近的symbol和偏移量,一般情況下會是發起調用的那個函數的名稱,除非該函數是內部函數,系統中沒有symbol,第三欄是被調用的函數。
再來查看一下t_Lcd任務的棧里的內容,從前面的任務信息里已經得知當前棧頂位置為fc8120b8,通過“d”命令顯示該地址的內容。
-> d 0xfc8120b0 fc8120b0: fc81 25b8 fc81 25b8 fc81 20c8 fe1f 24b0 *..%...%... ...$.* fc8120c0: fe50 8894 fdfc 6f30 fc81 20e8 fe1b b2dc *.P....o0.. .....* fc8120d0: fdf2 6b08 0000 0100 0000 000c 0000 0000 *..k.............* fc8120e0: 0000 0000 fdf1 ed80 fc81 20f8 fe1b b7d4 *.......... .....* fc8120f0: fd9a 3538 fdf1 ed80 fc81 2108 fe1a ab48 *..58......!....H* fc812100: fd9a 3538 fc81 2108 fc81 2238 fe1f c888 *..58..!..."8....* fc812110: 0000 0000 0000 0005 ffff ffff 0000 0600 *................* fc812120: 0000 000a fdf1 ed80 4230 312e 7874 6373 *........B01.xtcs* fc812130: 5f62 7566 2e69 6c32 0000 0000 0000 0000 *_buf.il2........*這里我們可以看到一些熟悉的地址,注意看最后兩列,在這里可以找到”tt”中顯示的第一欄地址即函數調用的返回地址。兩個返回地址之間是該函數的棧空間,用于保存棧指針、局部變量或者相關寄存器的值。要具體了解這些值是怎么來的,就要用到反匯編了。
反匯編通過objdump命令來實現,不同類型的cpu會有不同的可執行文件,例如
objdumpppc -D vxworks >xx.s反匯編的結果可能會很大,耐心等待吧。我們來看一下fclose()里調用free()的這一過程,在匯編代碼里查找返回地址fe1aab48。
fe1aaa5c <fclose>: …… fe1aab44: 48 01 0c 75 bl fe1bb7b8 <free> fe1aab48: 38 00 00 00 li r0,0bl是無條件跳轉指令,free()執行完之后,應返回fe1aab48繼續執行。
查找fe1bb7b8,看看free被調用時干了些什么?
fe1bb7b8 <free>: fe1bb7b8: 94 21 ff f0 stwu r1,-16(r1) fe1bb7bc: 7c 08 02 a6 mflr r0 fe1bb7c0: 90 01 00 14 stw r0,20(r1) fe1bb7c4: 7c 64 1b 78 mr r4,r3 fe1bb7c8: 3c 60 fe 51 lis r3,-431 fe1bb7cc: 38 63 88 94 addi r3,r3,-30572 fe1bb7d0: 4b ff f9 c5 bl fe1bb194 <memPartFree> fe1bb7d4: 80 01 00 14 lwz r0,20(r1) fe1bb7d8: 7c 08 03 a6 mtlr r0 fe1bb7dc: 38 21 00 10 addi r1,r1,16 fe1bb7e0: 4e 80 00 20 blr雖然不同類型cpu的匯編指令不同,但還是可以大致猜出其中的含義。stwu指令將r1保存到地址(r1-16)位置,然后讓將r1減去16保存到r1中,完成了保存并更新棧指針的過程;第2、3條語句將返回地址保存到r1+20的位置;下面幾條語句實際上是準備參數的過程,r3,r4一般用來保存函數的形參值,隨后調用了memPartFree。從memPartFree返回后,先從堆棧上讀取返回地址,然后將棧頂下移16字節,即恢復到原來的位置,最后跳轉到返回地址。
對著內存內容校驗一下,fclose調用free后的返回地址為fe1aab48,按照上面的分析,這個地址會被free()函數保存在r1+20的位置,因此r1+20=fc8120fc,r1=fc8120e8,而free中將r1減去了16,所以剛進入free()時,r1應該等于fc8120f8,這個數值會被保存在fc8120e8處,事實正是如此。
這里棧內空間的利用有點交叉混雜,暫時沒有弄的太明白,并且free()中沒有用到過fc8120f0-fc8120f8空間的內存,推測可能是棧的大小至少為16字節所以留空了,里面的內容是歷史遺留產物,是否如此,還有待進一步的研究。
以上是比較通用的分析過程,本來還涉及到結合c代碼的分析,跟具體的例子結合太緊密,就不贅述了,有一點可以提一下,想追溯函數調用過程中某一參數的運行值,可能會在調用者的棧中,也可能會在調用者的調用者的棧中,這個需要結合具體的匯編碼來分析。因為函數的棧開辟出來是為了保存一些臨時的亂七八糟的東西,比如需要用到r38,就會把r38臨時保存到棧上,返回時再恢復。而對本函數有用的變量,通常會被優化到寄存器中保存,除非寄存器不夠用了,才會用到棧空間。
總結
以上是生活随笔為你收集整理的vxworks 调式的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 现货黄金适合定投吗?你得先了解现货黄金的
- 下一篇: 货币政策工具有哪些?和财政政策的区别是什