VxWorks下的調(diào)試手段
主要介紹在Tornado集成開發(fā)環(huán)境下的調(diào)試方法,和利用支撐定位問題的步驟、思路。
嵌入式實(shí)時(shí)操作系統(tǒng)VxWorks和集成開發(fā)環(huán)境Tornado的組成結(jié)構(gòu)如下圖1。分為主機(jī)和目標(biāo)機(jī)系統(tǒng)。
圖1 集成開發(fā)環(huán)境結(jié)構(gòu)圖
在Tornado下,調(diào)試相關(guān)操作在Debug菜單下,包括:
圖2 Debug菜單
簡單解釋各菜單項(xiàng)的功能
Vxworks的Shell分為兩種:hostshell 和 target shell;
Tornado提供的WindShell建立了2者間的一個(gè)橋梁,從宿主機(jī)到目標(biāo)機(jī)之間的一個(gè)命令 shell。WindSh 是一種非常受歡迎的開發(fā)工具,它具有很強(qiáng)的交互性和可操作性,允許用戶調(diào)用內(nèi)存中的應(yīng)用程序模塊或是 VxWorks模塊中的任何例程。它不但具有一般命令語言的功能,而且也具有 C 語言的設(shè)計(jì)特點(diǎn),能夠解釋幾乎任何 C 語言表達(dá)式, 執(zhí)行大多數(shù) C 語言算子,解析符號(hào)表數(shù)據(jù)。對(duì)初用者來說,WindSh學(xué)習(xí)起來比較簡單,使用比較方便,對(duì)熟練用戶而言,則有較為高級(jí)的手段可以應(yīng)用。
WindSh是一個(gè)駐留在主機(jī)內(nèi)的C語言解釋器,通過它可運(yùn)行下載到目標(biāo)機(jī)上的所有函數(shù),包括VxWorks系統(tǒng)調(diào)用和應(yīng)用函數(shù)。Tornado外殼還能解釋常規(guī)的工具命令語言TCL。
WindSh不僅可以解釋幾乎所有的C語言表達(dá)式,而且可以實(shí)現(xiàn)所有的調(diào)試功能。它主要有以下調(diào)試功能:下載軟件模塊;刪除軟件模塊;產(chǎn)生任務(wù);刪除任務(wù);設(shè)置斷點(diǎn);刪除斷點(diǎn);運(yùn)行、單步、繼續(xù)執(zhí)行程序;查看內(nèi)存、寄存器、變量;修改內(nèi)存、寄存器、變量;查看任務(wù)列表、內(nèi)存使用情況、CPU利用率;查看特定的對(duì)象(任務(wù)、信號(hào)量、消息隊(duì)列、內(nèi)存分區(qū)、類);復(fù)位目標(biāo)機(jī)等。
Tab
補(bǔ)齊剩余部分
Ctrl+D
l 顯示與之匹配的所有符號(hào)
-> CurM^D
_CurMaster _CurModule
l 補(bǔ)齊剩余部分:
->CurMo^D
->CurModule
l 顯示命令摘要
->moduleShow ^D
moduleShow() - show the current status for all theloaded modules (WindSh)
STATUS moduleShow
(
char *moduleNameOrId /* name or ID of the module to show */
)
Ctrl+W
鍵入完整的命令后,繼續(xù)鍵入空格+ [Ctrl+W]。將會(huì)顯示html頁幫助信息.
Ctrl+H
刪除一字符
Ctrl+U
刪除一行
CTRL+C
重起shell
CTRL+X
Reboot
CTRL+S
臨時(shí)掛起輸出
CTRL+Q
恢復(fù)掛起
Esc
在輸入和編輯模式間切換
輸入類似Vi編輯命令, 如[Esc + k]:顯示前一次輸入的命令
h←j↓k↑l→
h()設(shè)置命令緩沖區(qū)長度。->h 500
?
C和TCL模式轉(zhuǎn)換符號(hào), 在c模式下敲?進(jìn)入tcl模式, 在tcl下敲?則進(jìn)入c模式;
@
在target還是在host上運(yùn)行, 在指令前加上@則在target上運(yùn)行, 否則在host上運(yùn)行
>
指令輸出重定向
<
指令輸入重定向
數(shù)據(jù)轉(zhuǎn)換:鍵入整數(shù)或字符后回車可以顯示該整數(shù)的十進(jìn)制及十六進(jìn)制值。也可以鍵入字符常量或符號(hào)地址。
比如:
->0x54+64
value = 148 = 0x94
->x = (8 * 6) / 4
x = 0x20ff378: value = 12 = 0xc
->Nom = “Nelson”
new symbol “Nom” added to symbol table.
Nom = 0x23fe798: value = 37742496 = 0x23fe7a0 =
Nom + 0x8
使用 ?shConfig 命令修改環(huán)境變量:
SH_GET_TASK_IO
為調(diào)用函數(shù)設(shè)置I/O重定向。ON:重定向到WindSh;OFF:I/O顯示到目標(biāo)機(jī)控制臺(tái)。
LD_PATH
為模塊設(shè)置搜索路徑,用“;”隔開。 例如:ld 命令提交后,Shell搜尋模塊的路徑順序?yàn)椋菏紫仍诋?dāng)前目錄,然后到LD_PATH設(shè)置的路徑。
LD_SEND_MODULES
設(shè)置load模式。
以下3個(gè)用不到
LD_CALL_XTORS
LD_COMMON_MATCH_ALL
DSM_HEX_MOD
tcl> setshellProcList
b bh bd bdall ccret e s so sysResume sysSuspend d l ld lkAddr lkup m mRegs unld agentMode Showbrowse checkStack classShow devs i intVecShow iStrict iosDevShow iosDrvShowiosFdShow memPartShow memShow moduleIdFigure moduleShow mqPxShow mqShowmsgQShow rBuffShow semPxSho w semShow show smMemPartShow smMemShowsysStatusShow taskShow trgShow version wdShow sp sp s taskIdDefaulttaskIdFigure td ti tr ts tt bootChange cd h help ls period printErrno printLogo pwd quit reboot repeat shellHistory shellPromptSet cplusXtorSetcplusStratShow cplus Ctors cplusDtors wvHostInfoShow evtBufferToFile hostShowicmpstatShow ifShow inetstatShow ipstatShow routestatShow taskCreateHookShowtaskDeleteHookShow taskSwitchHookShow taskRegs Show tw w taskWaitShowtcpstatShow tftpInfoShow udpstatShow
sp
用缺省參數(shù)創(chuàng)建一個(gè)任務(wù)(priority=100 返回值為任務(wù)ID,或錯(cuò)誤),立刻返回。任務(wù)的I/O不被重定向到shell。
如果直接敲例程名,回車,執(zhí)行完才返回。I/O被重定向。
sps
與上者不同在于啟動(dòng)該任務(wù)后馬上將其掛起
tr
恢復(fù)一個(gè)掛起的任務(wù)
ts
掛起一個(gè)任務(wù)
td
刪除一個(gè)任務(wù)
period
創(chuàng)建一個(gè)周期調(diào)用函數(shù)的任務(wù)
period 5testPrn 每隔5秒調(diào)用testPrn,易于做調(diào)試打印。
repeat
創(chuàng)建一個(gè)重復(fù)調(diào)用函數(shù)的任務(wù)
repeat 10testFunc1 連續(xù)執(zhí)行10次testFunc1函數(shù),易于做測(cè)試用。
mRegs
修改任務(wù)的寄存器變量。比較有用的是修改pc值,使程序退回到具體位置再運(yùn)行。 程序位置可以使用shift+F7(混合匯編方式顯示代碼)
-> mRegs"pc", s1u0
pc : 0499efd7 - 0x499efd1
i 顯示系統(tǒng)信息:
NAME ENTRY TID PRI STATUS PC SP ERRNO DELAY
---------------------- -------- --- ---------- -------- -------- ------- -----
tExcTask _excTask 4b79170 0 PEND 4276be 4b7908c d0003 0
iStrict 類似于i,但只查詢目標(biāo)機(jī)一次
ti 顯示相應(yīng)任務(wù)的TCB信息:
-> ti tWdbTask
NAME ENTRY TID PRI STATUS PC SP ERRNO DELAY
---------------------- -------- --- ---------- -------- -------- ------- -----
tWdbTask 0x417cc4 4b70c08 3 READY 4276be 4b70ae4 d0003 0
stack: base 0x4b70c08 end 0x4b6ccc8 size 16176 high 3840 margin 12336
options: 0xe
VX_UNBREAKABLE VX_DEALLOC_STACK VX_FP_TASK
edi = ffffffff esi = 4b70fb8 ebp = 4b70aec esp = 4b70ae4
ebx = 0 edx = 4276be ecx = 10101 eax = 0
eflags = 212 pc = 4276be
taskShow
顯示任務(wù)TCB信息, 基本同ti
taskCreateHookShow
顯示任務(wù)創(chuàng)建調(diào)用例程列表
_fppCreateHook 0x177008
_envCreateHook 0x156954
___wdbTaskCreat 0x114718
taskDeleteHookShow
顯示任務(wù)刪除調(diào)用例程列表
taskSwitchHookShow
顯示任務(wù)切換調(diào)用例程列表
_dbgTaskSwitch 0x180384
_SwitchHook 0xde7b78
w
顯示所有或者一個(gè)掛起任務(wù)的信息
-> w s1u1
NAME ENTRY TID STATUS DELAY OBJ_TYPE OBJ_ID OBJ_NAME
-------------------- -------- ---------- ----- ---------- -------- ------------
s1u1 _t2 4b65898 PEND 0 SEM_M 4b7ea48 N/A
tw
顯示某掛起任務(wù)的詳細(xì)信息。
-> tw s1u1
NAME ENTRY TID STATUS DELAY OBJ_TYPE OBJ_ID OBJ_NAME
---------- ---------- -------- ---------- ----- ---------- --------------------
s1u1 _t2 4b65898 PEND 0 SEM_M 4b7ea48 N/A
Semaphore Id : 0x4b7ea48
Semaphore Type : MUTEX
Task Queueing : FIFO
Pended Tasks : 1
State : Owner=0x4b6c960
taskWaitShow
同tw
taskRegsShow
顯示任務(wù)寄存器的內(nèi)容
->taskRegsShow 0x1c615534
edi = 0 esi = 1dd65514 ebp = 1c61546c esp = 1c615458
ebx = 1 edx = 1dfccac8 ecx = 7 eax = 0
eflags = 246 pc = 119604
CheckStack
顯示一個(gè)任務(wù)的使用堆棧的情況,沒有定義任務(wù)時(shí)顯示所有
-> checkStack tWdbTask
NAME ENTRY TID SIZE CUR HIGH MARGIN
------------ ------------ -------- ----- ----- -----------
tWdbTask 0x417cc4 4b70c08 16176 292 3840 12336
tt
顯示一個(gè)任務(wù)的調(diào)用狀況,解析堆棧
-> tt tShell
地址 函數(shù)名 偏移 被調(diào)用函數(shù)(函數(shù)參數(shù))
43ad37 _vxTaskEntry +47 : _shell (1, 0,0, 0, 0, 0, 0, 0, 0, 0)
41c414 _shell +13c: 41c438 ([1,0, 0, 0, 41c23c])
41c52e _shell +256: _ledRead(522efb8, 51e45e4, 80)
如果認(rèn)為被掛起,可找出在哪個(gè)函數(shù)調(diào)用時(shí)失敗。
taskIdFigure
報(bào)告任務(wù)的ID,以及名稱
taskIdDefault
設(shè)置或者取得缺省的任務(wù)id
int taskIdDefault
(
int tid /* user-supplied task ID; if 0,return default */
)
taskPrioritySet
實(shí)時(shí)改變?nèi)蝿?wù)運(yùn)行的優(yōu)先級(jí)
d
顯示目標(biāo)機(jī)內(nèi)存, 可以替代內(nèi)存觀察;
如: d 0x12345, 128, 1 顯示128個(gè)字節(jié)
d 0x12345, 32, 4 顯示32個(gè)DWORD
m 0x12345, 128, 1
m 0x12345, 32, 4
m
修改內(nèi)存
void m
(
void * adrs, /* address to change */
int width /* width of unit to be modified (1, 2, 4, 8) */
)
lkup
顯示指定符號(hào)信息, 和以下指令使用可以找到該變量附近變量, 對(duì)于查找變量被更改很有益處
-> lkup "CurModule"
_CurModule 0x01fd3160 comm (down.out)
-> lkup (“^_print”)
_printf 0x00029622 text (vxWorks)
_printErr 0x00029640 text (vxWorks)
_printExc 0x0002965e text (vxWorks)
value = 0 = 0x0
lkAddr
根據(jù)指定值搜索符號(hào)表,顯示的符號(hào)地址小于并最接近指定值
-> lkAddr 0x01fd3160
_CurUnit 0x01fd315c comm (down.out)
_CurModule 0x01fd3160 comm (down.out)
_IsFsStarted 0x01fd3164 comm (down.out)
_IntTaskSemaphore 0x01fd3168 comm (down.out)
_gtSemTaskTable 0x01fd316c comm (down.out)
_tR04ModuleReportState 0x01fd3174 comm (down.out)
l
顯示從指定位置開始多少行的匯編
printError
將錯(cuò)誤號(hào)翻譯為具體錯(cuò)誤信息。前16位錯(cuò)誤號(hào)為:module 在vwModNum.h中定義,對(duì)應(yīng)不同頭文件。后16位錯(cuò)誤號(hào)為:error number在相應(yīng)的頭文件中定義。
-> printErrno 0x110001
0x110001 = S_memLib_NOT_ENOUGH_MEMORY
ld
加載模塊到系統(tǒng)
[syms[,noAbort][,"name"]]Load stdin, or file, into memory
(syms = add symbols to table: -1 = none, 0 = globals, 1 = all)
unld
卸載模塊
reboot
reset network devices and transfercontrol to boot ROMs 重起, 有些mp板不能執(zhí)行;
bootChange
修改啟動(dòng)行參數(shù)
boot device : fei
processor number : 0
host name : host
file name : vxWorks
inet on ethernet (e) : 168.2.11.41:ffff0000
inet on backplane (b) :
host inet (h) : 168.2.111.1
gateway inet (g) :
user (u) : x86
ftp password (pw) (blank = use rsh) : x86
flags (f) :
target name (tn) :
startup script (s) :
other (o)
devs
列出目標(biāo)機(jī)系統(tǒng)上的所有設(shè)備, host:是指映象文件所在目錄,有些上面為mars:
-> devs
drv name
0 /null
2 /pcConsole/0
2 /pcConsole/1
7 host:
8 /vio
9 /tgtsvr
4 /HDisk
3 prnpip
iosDevShow
基本同devs
iosDrvShow
顯示系統(tǒng)中的驅(qū)動(dòng)狀態(tài)
drv create delete open close read write ioctl
1 421db4 0 421db4 421ddc 42b76c 42b69c 421e08
2 0 0 424fd4 0 425004 425044 425130
3 426e88 426f04 427170 426e34 427228 427254 426ffc
4 415f40 0 415f40 416000 42b76c 42b69c 416074
5 41626c 41642c 416288 416520 4165d0 416670 416710
iosFdShow
顯示系統(tǒng)中的文件標(biāo)識(shí)符
fdname drv
3/tyCo/0 1
4/vio/1 4
5/vio/2 4
6/vio/3 4
intVecShow
查看中斷向量表,
void intVecShow
(
int vector /* interrupt vector number or -1 to display the whole vectortable */
)
moduleShow
顯示系統(tǒng)中所有加載的模塊
MODULENAME MODULE ID GROUP # TEXT START DATA START BSS START
------------------------ -------------------- ---------- ---------- ----------
vxWorks.exe 0x365420 1 0x401000 0x43f000 0x442000
test.o 0xd32888 2 0x499efac 0x499eff4
msgQShow
顯示隊(duì)列的使用狀況
Message Queue Id : 0x1c710c0c
Task Queueing : FIFO
Message Byte Len : 8
Messages Max : 4000
Messages Queued : 0
Receivers Blocked : 1
Send Timeouts : 0
Receive Timeouts : 709968
SemShow
顯示信號(hào)量的信息
STATUS semShow
(
SEM_ID semId,/* semaphore to display */
int level /* 0 = summary, 1 = details */
)
->semShow NodeSemaphore ,0
Semaphore Id : 0x1c7a443c
Semaphore Type : MUTEX
Task Queueing : FIFO
Pended Tasks : 0
State : NotOwned
SemPxShow
顯示POSIX信號(hào)量的信息
wdShow
顯示看門狗的信息
mqPxShow
顯示POSIX消息隊(duì)列的信息
memPartShow
顯示分區(qū)塊及統(tǒng)計(jì)信息
memShow
顯示系統(tǒng)分區(qū)上空閑和已分配空間的總數(shù)等等
SUMMARY:
status bytes blocks avg block max block
------ ----------------- ---------- ----------
current
free 443257168 140 3166122 442697252
alloc 27726464 517 53629 -
cumulative
alloc 50636892 5873 8621 -
hostShow
顯示host列表
hostname inet address aliases
-------- ------------ -------
vxTarget 168.2.11.9
localhost 127.0.0.1
host 168.2.111.1
arpShow
顯示arp列表
LINK LEVEL ARP TABLE
destination gateway flags Refcnt Use Interface
--------------------------------------------------------------------------
168.2.111.1 00:05:5d:e4:14:3b 405 0 6897 fei0
--------------------------------------------------------------------------
ifShow
顯示網(wǎng)口信息
fei (unit number 0):
Flags:(0x8063) UP BROADCAST RUNNING ARP MULTICAST
Type:ETHERNET_CSMACD
Internetaddress: 168.2.11.9
Broadcastaddress: 168.2.255.255
Netmask0xffff0000 Subnetmask 0xffff0000
Ethernetaddress is 00:d0:d0:10:0b:09
Metric is 0
MaximumTransfer Unit size is 1500
11325 packetsreceived; 6965 packets sent
4374 multicastpackets received
11 multicastpackets sent
0 inputerrors; 0 output errors
0 collisions;0 dropped
lo (unit number 0):
Flags:(0x8069) UP LOOPBACK RUNNING ARP MULTICAST
Type:SOFTWARE_LOOPBACK
Internetaddress: 127.0.0.1
Netmask0xff000000 Subnetmask 0xff000000
Metric is 0
MaximumTransfer Unit size is 32768
0 packetsreceived; 0 packets sent
0 multicastpackets received
0 multicastpackets sent
0 inputerrors; 0 output errors
0 collisions;0 dropped
ipstatShow
顯示ip信息
total 7571
badsum 0
tooshort 0
toosmall 0
badhlen 0
badlen 0
infragments 0
fragdropped 0
fragtimeout 0
forward 0
cantforward 0
redirectsent 0
unknownprotocol 6996
nobuffers 0
reassembled 0
outfragments 0
noroute 0
icmpstatShow
顯示icmp信息
ICMP:
7060 calls toicmp_error
0 error notgenerated because old message was icmp
Outputhistogram:
destinationunreachable: 7060
0 message withbad code fields
0 message <minimum length
0 bad checksum
0 message withbad length
0 messageresponse generated
routestatShow
顯示路由信息
routing:
0 bad routingredirect
0 dynamicallycreated route
0 new gatewaydue to redirects
12 destinationsfound unreachable
0 use of a wildcard route
tcpstatShow
顯示tcp信息
TCP:
11740 packets sent
2840 data packets (137764 bytes)
6 data packets (1867 bytes)retransmitted
5642 ack-only packets (0 delayed)
0 URG only packet
0 window probe packet
0 window update packet
3254 control packets
8485packets received
44 acks (for 2429 bytes)
2801 duplicate acks
0 ack for unsent data
2840 packets (2128 bytes) receivedin-sequence
1 completely duplicate packet (29 bytes)
0 packet with some dup. data (0 byte duped)
2 out-of-order packets (0 byte)
0 packet (0 byte) of data after window
0 window probe
0 window update packet
0 packet received after close
0 discarded for bad checksum
0 discarded for bad header offset field
0 discarded because packet too short
2953 connection requests
0 connection accept
2802 connections established (includingaccepts)
2950 connections closed (including 2798drops)
147 embryonic connections dropped
2846 segments updated rtt (of 5797 attempts)
304 retransmit timeouts
0 connection dropped by rexmit timeout
0 persist timeout
147 keepalive timeouts
0 keepalive probe sent
147connections dropped by keepalive
udpstatShow
顯示udp信息
UDP:
7759 total packets
7757 input packets
2 output packets
0 incomplete header
0 bad data length field
0 bad checksum
581 broadcasts received with no ports
0 full socket
7176 pcb cache lookups failed
7176 pcb hash lookups failed
inetstatShow
顯示連接信息
Active Internetconnections (including servers)
PCB Proto Recv-Q Send-Q Local Address Foreign Address (state)
-------- ----------- ------ ----