vxworks 调式
1,boot操作相關(guān)
串口命令行重啟回車進(jìn)入boot:
查看boot版本:v
更新: c??? @
升級設(shè)備: w
運(yùn)行: g
?
2, 代碼:
2.1添加命令行:
??? DEFUN,
??? install_element
?
2.2 VxWorks使用
??? i:查看任務(wù);
??? memShow:查看內(nèi)存情況;
?? tt:查看堆棧信息;
?
?
3,測試
3.1 信令跟蹤測試步驟:
??? 設(shè)置局VLAN,指定上聯(lián)端口,VID;
??? 設(shè)置NGN及上聯(lián)數(shù)據(jù);
??? 連接上聯(lián)端口到MGC服務(wù)器,服務(wù)器腳本設(shè)置與NGN中設(shè)置一致;
??? 設(shè)置ONU語音帶寬;
??? 設(shè)置ONU FX端口,電話號碼,VID;
??? 打開信令跟蹤開關(guān)(地址為ONU IP, H.248端口為2944)
?
4,測試工作步驟
先檢查設(shè)備連線情況;
再檢查設(shè)備版本是否為最新;
檢查主備盤情況及IP地址等信息;
?
5,編程問題
運(yùn)行出現(xiàn)memPart Free ,invalid block, 在網(wǎng)上搜表明是一個非法的內(nèi)存塊導(dǎo)致任務(wù)掛起。
這是一篇很詳細(xì)的文章:
http://blog.rogerz.cn/archives/685
VxWorks中如果稍有不慎,就可能導(dǎo)致task suspend,如果運(yùn)氣好,shell沒有被掛起,則可以通過系統(tǒng)的一些命令追蹤一下掛起的原因。其中用到的主要命令是i、tt、ti、d等。
?
首先從出錯信息開始:
0xfc8125b8 (t_Lcd): memPartFree: invalid block 0xfdfc6f38 in partition 0xfe508894.
由于memPartFree了一個非法的內(nèi)存塊,導(dǎo)致了任務(wù)掛起,我們需要確定到底是哪條語句導(dǎo)致了這個異常的產(chǎn)生,可能是什么原因引起的。
首先,需要通過“i”命令察看任務(wù)狀態(tà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 ……可以看到任務(wù)t_Lcd的狀態(tài)為SUSPEND,即被掛起的狀態(tài)。其他各項的含義都比較清楚,ENTRY是任務(wù)的入口函數(shù),如果沒有symbol,則直接顯示地址,TID是任務(wù)的ID號,一般用任務(wù)的棧底地址表示,PC是當(dāng)前的指令位置,SP是當(dāng)前棧頂位置。
然后通過”tt”來追溯函數(shù)調(diào)用過程:
-> 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 ()我們可以了解到函數(shù)的調(diào)用過程,vxTaskEntry()?->fe392a30()->fe392bdc ()->fe392bfc ()->lcdShowPassWord ()->saveModifiedSetting ()->saveSettingValue (1)->fe1fc428 (0, 5, ffffffff)->fclose ()->free ()->memPartFree ()->taskSuspend ()。其他相關(guān)信息:第一欄是發(fā)生跳轉(zhuǎn)(即函數(shù)調(diào)用)后的返回地址,稍后會作詳細(xì)解釋,第二欄是離返回地址最近的symbol和偏移量,一般情況下會是發(fā)起調(diào)用的那個函數(shù)的名稱,除非該函數(shù)是內(nèi)部函數(shù),系統(tǒng)中沒有symbol,第三欄是被調(diào)用的函數(shù)。
再來查看一下t_Lcd任務(wù)的棧里的內(nèi)容,從前面的任務(wù)信息里已經(jīng)得知當(dāng)前棧頂位置為fc8120b8,通過“d”命令顯示該地址的內(nèi)容。
-> 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”中顯示的第一欄地址即函數(shù)調(diào)用的返回地址。兩個返回地址之間是該函數(shù)的棧空間,用于保存棧指針、局部變量或者相關(guān)寄存器的值。要具體了解這些值是怎么來的,就要用到反匯編了。
反匯編通過objdump命令來實(shí)現(xiàn),不同類型的cpu會有不同的可執(zhí)行文件,例如
objdumpppc -D vxworks >xx.s反匯編的結(jié)果可能會很大,耐心等待吧。我們來看一下fclose()里調(diào)用free()的這一過程,在匯編代碼里查找返回地址fe1aab48。
fe1aaa5c <fclose>: …… fe1aab44: 48 01 0c 75 bl fe1bb7b8 <free> fe1aab48: 38 00 00 00 li r0,0bl是無條件跳轉(zhuǎn)指令,free()執(zhí)行完之后,應(yīng)返回fe1aab48繼續(xù)執(zhí)行。
查找fe1bb7b8,看看free被調(diào)用時干了些什么?
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的位置;下面幾條語句實(shí)際上是準(zhǔn)備參數(shù)的過程,r3,r4一般用來保存函數(shù)的形參值,隨后調(diào)用了memPartFree。從memPartFree返回后,先從堆棧上讀取返回地址,然后將棧頂下移16字節(jié),即恢復(fù)到原來的位置,最后跳轉(zhuǎn)到返回地址。
對著內(nèi)存內(nèi)容校驗一下,fclose調(diào)用free后的返回地址為fe1aab48,按照上面的分析,這個地址會被free()函數(shù)保存在r1+20的位置,因此r1+20=fc8120fc,r1=fc8120e8,而free中將r1減去了16,所以剛進(jìn)入free()時,r1應(yīng)該等于fc8120f8,這個數(shù)值會被保存在fc8120e8處,事實(shí)正是如此。
這里棧內(nèi)空間的利用有點(diǎn)交叉混雜,暫時沒有弄的太明白,并且free()中沒有用到過fc8120f0-fc8120f8空間的內(nèi)存,推測可能是棧的大小至少為16字節(jié)所以留空了,里面的內(nèi)容是歷史遺留產(chǎn)物,是否如此,還有待進(jìn)一步的研究。
以上是比較通用的分析過程,本來還涉及到結(jié)合c代碼的分析,跟具體的例子結(jié)合太緊密,就不贅述了,有一點(diǎn)可以提一下,想追溯函數(shù)調(diào)用過程中某一參數(shù)的運(yùn)行值,可能會在調(diào)用者的棧中,也可能會在調(diào)用者的調(diào)用者的棧中,這個需要結(jié)合具體的匯編碼來分析。因為函數(shù)的棧開辟出來是為了保存一些臨時的亂七八糟的東西,比如需要用到r38,就會把r38臨時保存到棧上,返回時再恢復(fù)。而對本函數(shù)有用的變量,通常會被優(yōu)化到寄存器中保存,除非寄存器不夠用了,才會用到棧空間。
總結(jié)
以上是生活随笔為你收集整理的vxworks 调式的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 现货黄金适合定投吗?你得先了解现货黄金的
- 下一篇: 360剑灵洪门崛起服务器维护,剑灵洪门崛