日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

vxworks 调式

發布時間:2023/12/10 40 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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,0

bl是無條件跳轉指令,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 调式的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。