现在位置:首页 >> 嵌入式操作系统 >> VxWorks
VxWorks使用说明书(4)
作者:xiaoli 时间:2009/8/7 文章来源:来自网络

7、调试时的常用方法
下面是一些调试手段在调试器中的相应命令(操作)
调试手段
相应操作
设置断点
菜单命令Debug|Toggle BreakPoint
删除断点
菜单命令Debug|Toggle BreakPoint
运行
菜单命令Debug|Run
单步执行(进入函数)
菜单命令Debug|Step
单步执行(不进入函数)
菜单命令Debug|Next
继续执行(停下后的程序)
菜单命令Debug|Continue
执行完当前的函数,停在调用它的函数的下一条语句
菜单命令Debug|Finish
查看变量的值
菜单命令Debug|Inspect
查看当前函数的所有局部变量
菜单命令Debug|Locals
查看内存
菜单命令Debug|Memory
查看寄存器
菜单命令Debug|Registers
修改内存
Shell命令m
修改寄存器
Shell命令mRegs
修改变量
在Shell中直接给该变量赋值(局部变量无法用此方法修改)
卸载一个加载的模块
Shell命令unld
删除任务
Shell命令td
复位目标机
Shell命令reboot
用该命令的好处:目标服务器自动与目标代理重新链接,Shell自动重启
查看任务
在Browser对象信息窗口输入待查看的任务名或ID
查看信号量
在Browser对象信息窗口输入待查看的信号量名或ID
查看消息队列
在Browser对象信息窗口输入待查看的消息队列命或ID
内存分区
在Browser对象信息窗口输入待查看的内存分区ID
看门狗
在Browser对象信息窗口输入待查看的看门狗ID
类(class)
在Browser对象信息窗口输入待查看的类的ID
查看内存使用(模块使用内存的情况)
Browser的内存使用窗口
查看任务列表(系统里的所有任务)
Browser的任务列表窗口
查看CPU占用率
Browser的Spy窗口
查看堆栈使用情况
Browser的堆栈检查窗口
 
注:
* Shell可以通过菜单命令Debug | Shell启动
* Shell的原语可以通过在Shell中输入help列出
* Browser可以通过菜单命令Debug | Browser启动
* Debugger命令窗口的命令可以通过在命令窗口输入help列出
 
8、任务调试模式下的多任务调试
在任务调试模式下,在一个集成环境中,在一个任务中调试,在另一个任务中设置断点,设置的断点不起作用。这是因为一个调试器只能处理一个TCB(任务控制块),每个任务都有一个TCB,因此一个调试器只能调试一个任务,要调试几个任务就要启动几个调试器。一个集成环境只能启动一个调试器,所以要调试几个任务就要启动几个集成环境。另外,需要在被调试的任务的待调试的第一条语句前加入taskSuspend(0)语句,挂起该任务,否则任务就可能会在调试前被执行。
 
下面是多任务调试的测试用例的源代码
/* VxWorks includes */
#include "vxWorks.h"
#include "taskLib.h"
#include "stdio.h"
#include "msgQLib.h"
 
int g_lTaskATid;
int g_lTaskBTid;
MSG_Q_ID g_MsgQ1id;
MSG_Q_ID g_MsgQ2id;
 
void MultiTaskTestTaskA(void)
{
char cMsgToTaskB[100];
char cMsgFromTaskB[100];
 
sprintf(cMsgToTaskB,"To TaskB \n");
 
printf(" Hello from MultiTaskTestTaskA \n");
 
/*start point of debugging for MultiTaskTestTaskA*/
taskSuspend(0);
 
for(;;)
{
printf(" Hello from MultiTaskTestTaskA \n");
 
/*Send message to MultiTaskTestTaskB*/
 
msgQSend(g_MsgQ1id,cMsgToTaskB,sizeof(cMsgToTaskB),WAIT_FOREVER, MSG_PRI_NORMAL);
 
/*Receive message from MultiTaskTestTaskB*/
msgQReceive(g_MsgQ2id,cMsgFromTaskB,100,WAIT_FOREVER);
printf("%s",cMsgFromTaskB);
}
 
}
 
void MultiTaskTestTaskB(void)
{
char cMsgToTaskA[100];
char cMsgFromTaskA[100];
 
sprintf(cMsgToTaskA,"To TaskA \n");
 
printf(" Hello from MultiTaskTestTaskB \n");
 
/*start point of debugging for MultiTaskTestTaskA*/
taskSuspend(0);
 
for(;;)
{
printf(" Hello from MultiTaskTestTaskB \n");
 
/*Send message to MultiTaskTestTaskA*/
msgQSend(g_MsgQ2id,cMsgToTaskA,sizeof(cMsgToTaskA),WAIT_FOREVER, MSG_PRI_NORMAL);
 
/*Receive message from MultiTaskTestTaskA*/
msgQReceive(g_MsgQ1id,cMsgFromTaskA,100,WAIT_FOREVER);
printf("%s",cMsgFromTaskA);
}
}
 
 
/*This function spawns MultiTaskTestTaskA and MultiTaskTestTaskB , creates g_MsgQ1id and g_MsgQ2id , is entry for debugging.*/
void MultiTaskTestInit(void)
{
printf(" Hello from MultiTaskTestInit \n");
 
g_MsgQ1id=msgQCreate(20,100,MSG_Q_FIFO);
if(g_MsgQ1id==NULL)
{
printf(" ERROR: create g_MsgQ1 error \n");
}
 
g_MsgQ2id=msgQCreate(20,100,MSG_Q_FIFO);
if(g_MsgQ1id==NULL)
{
printf(" ERROR: create g_MsgQ2 error \n");
}
 
 
printf(" Spawning a new task called MultiTaskTestTaskA \n\n");
g_lTaskATid = taskSpawn("MultiTaskTestTaskA", 100,0,10000, (FUNCPTR)MultiTaskTestTaskA, 0,0,0,0,0,0,0,0,0,0);
if(g_lTaskATid == ERROR)
{
printf(" ERROR: task did not spawn \n");
exit(1);
}
 
printf(" Spawning a new task called MultiTaskTestTaskB
\n");
g_lTaskBTid = taskSpawn("MultiTaskTestTaskB", 100,0,10000, (FUNCPTR)MultiTaskTestTaskB, 0,0,0,0,0,0,0,0,0,0);
if(g_lTaskBTid == ERROR)
{
printf(" ERROR: task did not spawn \n");
exit(1);
}
 
exit(0);
}
 
多任务调试步骤:
* 用-g选项编译源代码产生目标文件
* 下载产生的目标文件
* 在MultiTaskTestInit函数的开始设置断点
* 把MultiTaskTestInit设置为调试任务的人口函数
* 单步执行产生MultiTaskTestTaskA任务的语句后可以在串口(超级终端)上看到字符串Hello from MultiTaskTestTaskA,用Browser查看任务,可以看到任务MultiTaskTestTaskA出于挂起态(suspended),表明程序执行了taskSuspend(0)语句。
* 运行另一个Tornado集成环境
* Attach任务MultiTaskTestTaskA,
* 在语句msgQReceive(g_MsgQ2id,cMsgFromTaskB,100,WAIT_FOREVER)的下一条语句处设置断点
* 运行任务MultiTaskTestTaskA。可以看到没有执行到断点处,用Browser查看任务状态,MultiTaskTestTaskA出于阻塞态(pended),因为它在等待消息。
* 单步执行MultiTaskTestInit到产生MultiTaskTestTaskB任务的下一条语句,可以看到MultiTaskTestTaskB任务处于挂起态
* 再运行另一个Tornado集成环境
* Attach任务MultiTaskTestTaskB,
* 在语句msgQReceive(g_MsgQ1id,cMsgFromTaskA,100,WAIT_FOREVER)下一条语句处设置断点
* 运行任务MultiTaskTestTaskB。可以看到执行到断点处停下。这是因为MultiTaskTestTaskA任务已经发送一条消息到MultiTaskTestTaskB的接收队列中。
* 此时,可以看到MultiTaskTestTaskA任务也运行到断点处,因为为MultiTaskTestTaskB任务已经发送一条消息到MultiTaskTestTaskA的接收队列中。

上一篇:VxWorks使用说明书(5)[返回列表]下一篇: VxWorks使用说明书(3)