Embedded 版 (精华区)

发信人: wanily (醉了酒的老鼠), 信区: Embedded
标  题: VxWorks使用说明书(4)(zz)
发信站: 哈工大紫丁香 (2003年05月29日12:14:55 星期四), 站内信件

VxWorks使用说明书(4) <--- 〖回复该帖子〗
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查看任务,可以看到任务MultiTaskTes
tTaskA出于挂起态(suspended),表明程序执行了taskSuspend(0)语句。
* 运行另一个Tornado集成环境
* Attach任务MultiTaskTestTaskA,
* 在语句msgQReceive(g_MsgQ2id,cMsgFromTaskB,100,WAIT_FOREVER)的下一条语句处设
置断点


,MultiTaskTestTaskA出于阻塞态(pended),因为它在等待消息。
* 单步执行MultiTaskTestInit到产生MultiTaskTestTaskB任务的下一条语句,可以看到
MultiTaskTestTaskB任务处于挂起态
* 再运行另一个Tornado集成环境
* Attach任务MultiTaskTestTaskB,
* 在语句msgQReceive(g_MsgQ1id,cMsgFromTaskA,100,WAIT_FOREVER)下一条语句处设置
断点
* 运行任务MultiTaskTestTaskB。可以看到执行到断点处停下。这是因为MultiTaskTes
tTaskA任务已经发送一条消息到MultiTaskTestTaskB的接收队列中。
* 此时,可以看到MultiTaskTestTaskA任务也运行到断点处,因为为MultiTaskTestTas
kB任务已经发送一条消息到MultiTaskTestTaskA的接收队列中。


--
醉了酒的老鼠想吃猫

※ 来源:·哈工大紫丁香 bbs.hit.edu.cn·[FROM: 202.118.226.4]
[百宝箱] [返回首页] [上级目录] [根目录] [返回顶部] [刷新] [返回]
Powered by KBS BBS 2.0 (http://dev.kcn.cn)
页面执行时间:3.902毫秒