VxWorks下的調試手段
主要介紹在Tornado集成開發(fā)環(huán)境下的調試方法,和利用支撐定位問題的步驟、思路。
嵌入式實時操作系統(tǒng)VxWorks和集成開發(fā)環(huán)境Tornado的組成結構如下圖1。分為主機和目標機系統(tǒng)。
圖1 集成開發(fā)環(huán)境結構圖
在Tornado下,調試相關操作在Debug菜單下,包括:
圖2 Debug菜單
簡單解釋各菜單項的功能
Vxworks的Shell分為兩種:hostshell 和 target shell;
Tornado提供的WindShell建立了2者間的一個橋梁,從宿主機到目標機之間的一個命令 shell。WindSh 是一種非常受歡迎的開發(fā)工具,它具有很強的交互性和可操作性,允許用戶調用內存中的應用程序模塊或是 VxWorks模塊中的任何例程。它不但具有一般命令語言的功能,而且也具有 C 語言的設計特點,能夠解釋幾乎任何 C 語言表達式, 執(zhí)行大多數(shù) C 語言算子,解析符號表數(shù)據(jù)。對初用者來說,WindSh學習起來比較簡單,使用比較方便,對熟練用戶而言,則有較為高級的手段可以應用。
WindSh是一個駐留在主機內的C語言解釋器,通過它可運行下載到目標機上的所有函數(shù),包括VxWorks系統(tǒng)調用和應用函數(shù)。Tornado外殼還能解釋常規(guī)的工具命令語言TCL。
WindSh不僅可以解釋幾乎所有的C語言表達式,而且可以實現(xiàn)所有的調試功能。它主要有以下調試功能:下載軟件模塊;刪除軟件模塊;產生任務;刪除任務;設置斷點;刪除斷點;運行、單步、繼續(xù)執(zhí)行程序;查看內存、寄存器、變量;修改內存、寄存器、變量;查看任務列表、內存使用情況、CPU利用率;查看特定的對象(任務、信號量、消息隊列、內存分區(qū)、類);復位目標機等。
Tab
補齊剩余部分
Ctrl+D
l 顯示與之匹配的所有符號
-> CurM^D
_CurMaster _CurModule
l 補齊剩余部分:
->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]。將會顯示html頁幫助信息.
Ctrl+H
刪除一字符
Ctrl+U
刪除一行
CTRL+C
重起shell
CTRL+X
Reboot
CTRL+S
臨時掛起輸出
CTRL+Q
恢復掛起
Esc
在輸入和編輯模式間切換
輸入類似Vi編輯命令, 如[Esc + k]:顯示前一次輸入的命令
h←j↓k↑l→
h()設置命令緩沖區(qū)長度。->h 500
?
C和TCL模式轉換符號, 在c模式下敲?進入tcl模式, 在tcl下敲?則進入c模式;
@
在target還是在host上運行, 在指令前加上@則在target上運行, 否則在host上運行
>
指令輸出重定向
<
指令輸入重定向
數(shù)據(jù)轉換:鍵入整數(shù)或字符后回車可以顯示該整數(shù)的十進制及十六進制值。也可以鍵入字符常量或符號地址。
比如:
->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
為調用函數(shù)設置I/O重定向。ON:重定向到WindSh;OFF:I/O顯示到目標機控制臺。
LD_PATH
為模塊設置搜索路徑,用“;”隔開。 例如:ld 命令提交后,Shell搜尋模塊的路徑順序為:首先在當前目錄,然后到LD_PATH設置的路徑。
LD_SEND_MODULES
設置load模式。
以下3個用不到
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)建一個任務(priority=100 返回值為任務ID,或錯誤),立刻返回。任務的I/O不被重定向到shell。
如果直接敲例程名,回車,執(zhí)行完才返回。I/O被重定向。
sps
與上者不同在于啟動該任務后馬上將其掛起
tr
恢復一個掛起的任務
ts
掛起一個任務
td
刪除一個任務
period
創(chuàng)建一個周期調用函數(shù)的任務
period 5testPrn 每隔5秒調用testPrn,易于做調試打印。
repeat
創(chuàng)建一個重復調用函數(shù)的任務
repeat 10testFunc1 連續(xù)執(zhí)行10次testFunc1函數(shù),易于做測試用。
mRegs
修改任務的寄存器變量。比較有用的是修改pc值,使程序退回到具體位置再運行。 程序位置可以使用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,但只查詢目標機一次
ti 顯示相應任務的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
顯示任務TCB信息, 基本同ti
taskCreateHookShow
顯示任務創(chuàng)建調用例程列表
_fppCreateHook 0x177008
_envCreateHook 0x156954
___wdbTaskCreat 0x114718
taskDeleteHookShow
顯示任務刪除調用例程列表
taskSwitchHookShow
顯示任務切換調用例程列表
_dbgTaskSwitch 0x180384
_SwitchHook 0xde7b78
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
顯示某掛起任務的詳細信息。
-> 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
顯示任務寄存器的內容
->taskRegsShow 0x1c615534
edi = 0 esi = 1dd65514 ebp = 1c61546c esp = 1c615458
ebx = 1 edx = 1dfccac8 ecx = 7 eax = 0
eflags = 246 pc = 119604
CheckStack
顯示一個任務的使用堆棧的情況,沒有定義任務時顯示所有
-> checkStack tWdbTask
NAME ENTRY TID SIZE CUR HIGH MARGIN
------------ ------------ -------- ----- ----- -----------
tWdbTask 0x417cc4 4b70c08 16176 292 3840 12336
tt
顯示一個任務的調用狀況,解析堆棧
-> tt tShell
地址 函數(shù)名 偏移 被調用函數(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)
如果認為被掛起,可找出在哪個函數(shù)調用時失敗。
taskIdFigure
報告任務的ID,以及名稱
taskIdDefault
設置或者取得缺省的任務id
int taskIdDefault
(
int tid /* user-supplied task ID; if 0,return default */
)
taskPrioritySet
實時改變任務運行的優(yōu)先級
d
顯示目標機內存, 可以替代內存觀察;
如: d 0x12345, 128, 1 顯示128個字節(jié)
d 0x12345, 32, 4 顯示32個DWORD
m 0x12345, 128, 1
m 0x12345, 32, 4
m
修改內存
void m
(
void * adrs, /* address to change */
int width /* width of unit to be modified (1, 2, 4, 8) */
)
lkup
顯示指定符號信息, 和以下指令使用可以找到該變量附近變量, 對于查找變量被更改很有益處
-> 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ù)指定值搜索符號表,顯示的符號地址小于并最接近指定值
-> 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
將錯誤號翻譯為具體錯誤信息。前16位錯誤號為:module 在vwModNum.h中定義,對應不同頭文件。后16位錯誤號為:error number在相應的頭文件中定義。
-> 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
修改啟動行參數(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
列出目標機系統(tǒng)上的所有設備, 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)中的驅動狀態(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)中的文件標識符
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
顯示隊列的使用狀況
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
顯示信號量的信息
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信號量的信息
wdShow
顯示看門狗的信息
mqPxShow
顯示POSIX消息隊列的信息
memPartShow
顯示分區(qū)塊及統(tǒng)計信息
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
顯示網口信息
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)
-------- ----------- ------ ----