VxWorks调试手段和方法研究Word格式文档下载.docx
- 文档编号:19335543
- 上传时间:2023-01-05
- 格式:DOCX
- 页数:15
- 大小:537.25KB
VxWorks调试手段和方法研究Word格式文档下载.docx
《VxWorks调试手段和方法研究Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《VxWorks调试手段和方法研究Word格式文档下载.docx(15页珍藏版)》请在冰豆网上搜索。
选中BreakatEntrypoint框可以在函数的第一条语句处设置一个临时断点,这样程序一运行就会停在第一条语句处,用户可以执行单步,跳过子函数调用或恢复执行。
3Attach和Dettach一个任务
Attach
选择Debug下拉菜单中的Attach选项可以使一个已经运行的任务处于调试状态。
如果在此之前正在调试另一个任务,以前的任务就会被释放,脱离调试器的控制,并保持其当前状态(运行或中止)。
如图2所示,Attach窗口显示出运行于目标板上的所有任务的滚动列表。
可以在任务列表中选择一个任务,也可以通过在Attachto框中键入任务名称(或任务ID)选择一个任务。
Attach一个任务以后,调试器立即挂起该任务。
Attach窗口的第一项为System。
选择此项可以进入系统调试模式,如果BSP配置不支持系统模式,将会显示出错信息。
Detach
Detach选项使当前任务脱离调试器的控制,并将任务挂起,在以后需要的时候仍可以通过选择Attach使该任务处于调试状态。
DetachandResume
单击DetachandResume可以使当前任务脱离调试器的控制,并使任务继续执行
4断点
断点类型
●任务级断点,仅对当前调试任务有效,设置时单击菜单命令Debug|ToggleBreakPoint也可将光标放在源文件处,点击
●全局断点,对所有任务都有效,设置全局断点,采用菜单命令Debug|ToggleGlobalBreakpoint,在任务模式下,断点只对当前被调试的任务有效,但是有时候,我们想看看当前被调试任务的动作是否会对另一个任务有影响,而同时又只能调试一个任务,这时我们就必须使用全局断点。
全局断点对任何任务都有效,一旦程序执行到此处,不管当前调试任务为何,此任务都将进入Suspend态,然后可以切换到此任务进行调试。
●临时断点,设置时选择菜单命令Debug|ToggletemoBreakPoint,临时断点仅中止程序一次,一旦程序在此中止,Debugger自动删除它。
临时断点的图标是一个中空的倒三角,与其它断点相区别。
●条件断点,只有当条件满足时,断点才起作用。
任务级断点和全局断点可以设置成临时断点或条件断点,或临时条件断点。
如下描述。
设置断点
在Debug下拉菜单中选择Breakpoints就可以设置多个不同类型的断点。
如图3所示,在Location框中键入文件名和行数,选择断点类型(任务级断点或全局断点),单击Add,新的断点就会出现在断点列表中。
如果选中了Externallymanaged框,表示该断点是通过其他(非调试器)途径设置的,如TornadoShell。
单击Adcanced按钮可以打开AdvancedBreakpoint窗口,如图4所示。
ConditionExpression输入框允许用户给断点附加条件,只有在此条件满足时,断点才会起作用,程序才会在此暂停。
可以在条件框内输入一个整型表达式,或是一个变化的内存值,只要是非零值,就假定此条件为真。
Numberoftimestoskip框指定在导致程序暂停之前允许经历的断点次数。
OnBreak选项指定了如何处理一个断点:
●Keep将断点定义为永久断点
●Delete将断点定义为临时断点,程序经历一次此断点即删除它
●Disable将断点定义为临时断点,程序经历一次此断点即关闭它,以后仍可以经手工使能
删除断点
为了删除各类断点,使光标指向断点所在的代码行,单击
图标,或使用如图3所
示的Breakpoints对话框。
5程序执行
在调试器的控制下,一旦一个任务被中止了(通常是遇到了一个断点),就可以单步运行程序,跳过子程序调用,或恢复程序执行。
在CrossWind工具栏中与控制程序执行有关的图标如下所示:
:
中断程序的执行。
使程序继续执行(Continue),F5
单步(StepInto),F11
单步(StepOver),F10
跳出当前函数(StepOut),SHIFT+F11
Continue
程序中止以后,可以使用Debug菜单的Continue命令恢复程序执行。
如果没有遇到断点、中断或信号,任务一直运行到结束。
StepInto
单击StepInto,可以单步执行程序。
如果打开了调试器的观察窗口(检查数据、内存和堆栈),窗口中的值会随着程序的单步执行自动更新。
如果遇到一个子程序调用,StepInto会单步运行到子程序的第一行,即可以进入调用的子程序。
但是当调用了系统子程序和编译时不带调试信息的应用子程序时,StepInto不会进入该子程序。
当Editor窗口的当前视图显示出汇编代码(从View下拉菜单中选择Disassembly或Mixed,或是当前代码没有调试符号),StepInto将会使程序执行到下一条指令,而非下一条源代码。
StepOver
如果需要单步执行程序而不进入其子程序,单击StepOver。
StepOver命令与StepInto命令类似,只是在遇到子函数调用时,StepOver会一次将子函数执行完,并停在子函数调用的下一条语句。
StepOut
当单步运行一个程序时,可能会发现问题出现在当前子函数的上一级调用函数处。
这时可以使用StepOu命令继续执行程序直到当前子函数结束。
程序停在子函数调用的下一条语句,Debugger重新获得控制权。
RuntoCursor
为了使程序执行到一个特定的位置,却不想在此设置断点,可以将光标放在所需的代码行,单击鼠标右键,在弹出的菜单中选择RuntoCursor。
6观察各类信息
当程序在调试器的控制下暂停时,可以使用调试器的辅助窗口检查局部变量和全局变量、函数参数、寄存器、目标板内存和执行函数栈。
辅助窗口有两种显示方式,docked或free-floating。
在Tools|Options|Debugger窗口中取消Dockingviews选择框,将辅助窗口设为浮动的,就可以随意调整窗口大小和位置。
在CrossWind工具栏中与观察各类信息行有关的图标如下所示:
打开/关闭Watch窗口,可以用来查看全局变量、表达式或其他符号的值,ALT+3
打开/关闭Variables窗口,用来查看局部变量的值,ALT+4
打开/关闭Registers窗口,用来查看寄存器的值,ALT+5
打开/关闭BackTrace窗口,用来查看当前函数的调用栈情况,ALT+7
打开/关闭Memory窗口,用来查看指定地址的内存内容,ALT+6
上述窗口可以同时打开。
每次程序在调试器的控制下暂停时,窗口中的内容将会更新。
更新时只有那些变化了的值会高亮。
Watch
Watch窗口显示了在整个程序运行过程中变量的当前值。
Watch窗口有四页,可以将相关的变量组成一页,方便观察。
在Editor窗口选择所需的符号并单击鼠标右键,在弹出的菜单中选择AddtoWatch就可以将变量添加到Watch窗口了,该变量的值允许手工修改。
在Watch窗口中单击鼠标右键,在弹出的菜单中可以选择添加、删除变量。
Variabe
单击Debug下拉菜单的Variable命令或工具栏中的Varible图标,就可以打开显示局部变量的Variable窗口。
Variable窗口总是显示当前执行函数的局部变量的值。
如果程序跳到另一个函数,新函数的局部变量就会取代旧函数的局部变量显示在Variable窗口中。
Variable窗口中的局部变量是由Tornado自动加入删除的,无需用户的手工操作,但允许手工修改局部变量的值。
Register
单击Debug下拉菜单的Register命令或工具栏中的Register图标,就可以打开显示寄存器值的Register窗口。
窗口中的内容取决于目标板的结构。
在Tools|Options|Debugger窗口中取消Dockingviews选择框,将窗口设为浮动(free-floating)的,窗口的标题就会显示出与芯片结构有关的信息,如对于PowerPc系列显示为ppc。
可以手工修改寄存器的值。
但是Tornado的Register窗口只能显示出目标板CPU的有限的几个通用寄存器和特殊功能寄存器,对于开发与硬件结构紧密相关的底层应用程序不是很方便。
据技术支持人员介绍,可以安装SingleStepforTornado,使用我们在pSOS中已经非常熟悉的SingleStep调试器来解决这个问题。
Backtrace
利用Backtrace窗口可以检查程序运行到当前函数之前的函数调用顺序,即函数调用栈。
在Backtrace窗口中双击任一函数,可以将Editor窗口的光标移至该函数内发生函数调用处。
但此举并没有改变程序的运行流程,只是方便用户检查程序以前的函数调用情况,此时的光标会改变颜色,与程序正常运行时的光标相区别。
Memory
Memory窗口显示出从指定起始地址开始的一部分目标内存值。
调试器将起始域中键入的每一个起始地址保存下来,可以从下拉列表中选择一个以前显示过的地址。
单击
按钮可以更新内存显示。
Memory窗口中显示的内存值不能手工修改。
如果想修改某一地址的内存值需要通过Shell命令m来完成。
在Tools|Options|Debugger窗口中修改MemoryWindow选项可以改变Memory窗口中的内存值的显示方式。
7调试方法
VxWorks支持两种调试模式:
●任务模式调试(TaskModeDebug)
●系统模式调试(SystemModeDebug)
7.1任务模式调试
对单个任务进行调试,其他任务和中断将照常运行。
缺省为任务级调试模式,选择菜单Debug|Attach,然后选中要调试的任务即可对该任务进行调试。
一个Debugger一次只能调试一个任务,如果要对另一个任务进行调试,需通过Attach窗口选择该任务,Debugger就会切换到该任务调试。
在任务级调试模式下,TargetServer和TargetAgent通过中断方式进行通信,因此不能调试中断程序。
任务级断点
在任务级调试模式下,任务级断点仅对当前调试任务有效,程序运行中若遇到非调试任务中的任务级断点,将忽略此断点。
全局断点
对所有任务都有效。
一旦程序执行到全局断点处,不管当前调试任务为何,包含此全局断点的任务都将进入Suspend状态,如果该任务非当前调试任务,可以通过Attach命令将调试器切换至此任务调试。
在任务级模式下调试多任务
在任务级调试模式下调试多任务必须使用全局断点。
本例中的源程序如附录所示。
具体调试步骤如下:
●启动VxSim仿真器,下载应用程序的目标代码
●启动调试器,分别在任务TaskA和任务TaskB中设置全局断点
●选择Run|MultiTaskTest,在RunTask窗口中选中BreakatEntrypoint框,程序即会在MultiTaskTest任务的入口点暂停
●单步程序,当程序运行经过产生任务TaskA后,可以在browse窗口观察到此时产生的TaskA已经被挂起,因为在TaskA中设置了一个全局断点
●选择Attach|TaskA使调试器切换到调试TaskA
●单步运行完TaskA,选择Attach|tDbgTask,使调试器返回继续调试MultiTaskTest
●可以用同样的方法调试TaskB
7.2系统模式调试
把整个系统当作一个任务进行调试,因此可以调试中断。
断点对所有的任务都起作用。
在Attach窗口选择System可以进入系统级调试模式,进入系统级调试模式将中止整个目标系统:
所有的任务,内核和ISR。
此时TargetServer和TargetAgent通过轮循方式进行通信。
所以,只有支持END模式的网络才可以支持系统模式调试,而串口就两种都支持。
目标代理的配置
调试器工作在何种模式需要与目标代理的配置保持一致。
目标代理可以配置成以下三种模式:
●任务模式,代理是作为一个VxWorks任务运行的。
调试也是在一个任务的基础上进行的,可以将任务独立出来而不影响目标系统的其余部分。
●系统模式,代理运行于VxWorks之外,可以将被调试的应用程序与VxWorks视为一个单线程的任务。
在此模式下,当目标运行遇到一个断点,VxWorks和应用程序都会停止并锁住中断。
这种模式的最大优点是可以单步ISR。
●双模式,同时配置了两种代理:
一个任务模式代理和一个系统模式代理。
一次只能激活一个代理,可以通过调试器(选择Attach|tTask、Attach|system)或Shell命令(sysResume/sysSupend)在两种模式之间切换。
END(EnhancedNetWorkDriver)模式的网络支持双模式。
为了支持系统模式代理,目标通讯路径必须工作在轮询方式(因为即使系统挂起,外
部代理也需要和主机进行通讯)。
因此通讯路径的选择影响可用的调试模式。
可以在配置VxWorks映象时配置目标代理。
如果需要配置支持双模式的目标代理,可将工作台的VxWorks窗口中developmenttoolcomponents|selectWDBconnect选项设为WDBENDdriverconnrction,并选中developmenttoolcomponents|selectWDBmode中的WDBsystemdebugging和WDBtaskdebugging。
如图4所示。
只有使用了END驱动器(具有一个轮询接口)的目标板才支持双模式代理。
在END连接下,代理直接使用END驱动器而非UDP/IP协议栈。
可见,调试器支持双模式的前提是:
●下载配置了双模式代理的VxWorks映象
●目标板使用END驱动器
在仿真器环境下调试应用程序时,缺省的用于仿真器的VxWorks映象的WDBagent
connection为WDBsimulatorpipeconnection,WDBmode支持双模式。
因此无需另外配置即可使调试器工作在双模式下。
在系统级模式下调试多任务
在系统级模式下的断点对所有任务都有效。
值得注意的是,在系统级调试模式下运行一个程序不能使用run指令,必须采用Shell命令sp。
如果使用了run命令,系统将会自动恢复任务级调试模式。
Shell工具提供了许多在系统级调试时常用的命令:
●sysSuspend,进入系统模式并中止目标系统
●sysResume,返回任务模式,恢复目标系统的执行
●agentModeShow,显示当前调试模式(任务级或系统级)
●sysStatusShow,显示系统上下文状态(挂起或运行)
●b,设置系统级断点,在任何任务,内核或ISR中遇到了断点,整个系统停止运行
●c,恢复整个系统运行,但仍处于系统模式
●i,显示系统上下文状态和代理模式
●s,单步整个系统
●sp,添加一个任务至执行队列中,在系统模式下只能通过sp来启动新任务,而不能运行Debugger的run命令
具体的调试步骤如下:
●启动调试器。
在Debug下拉菜单中Attach窗口中选中Attach|system,进入系统级调试模式,此时会出现一个显示系统汇编代码的窗口,整个系统处于停止状态
●分别在MultiTaskTest、TaskA和TaskB的入口设置断点
●打开Shell窗口,键入spMultiTaskTest命令,产生一个MultiTaskTest任务
●在Shell窗口中键入c,程序继续执行,并停在MultiTaskTest的入口
●单步程序,产生TaskA,继续(continue)执行,程序运行到任务TaskA,并在其入口处暂停,可以单步调试TaskA,观察Browse窗口的Tasks信息显示此时已经产生t1和TaskA,两个任务均处于ready状态
●继续单步,执行完TaskA后程序返回MultiTaskTest,单步程序,产生TaskB
●单击Continue键,程序运行到任务TaskB,并在其入口处暂停,可以单步调试TaskB,观察Browse窗口的Tasks信息显示此时已经产生t1和TaskB,两个任务均处于ready状态
●执行完TaskB后,程序返回MultiTaskTest,继续执行,直到结束该任务。
任务执行的先后顺序与任务的优先级有关,可以尝试修改优先级,观察程序执行的过
程。
在系统级模式下调试中断程序
中断服务程序只能在系统调试模式下调试,不能在任务调试模式下调试。
因为中断服务程序是作为系统的一部分运行,不是以任务方式运行,因此不需要为它产生任务。
本文以usrClock()为例说明中断服务程序的调试过程。
usrClock()是连接到系统时钟的中断处理函数,当VxWorks运行时,每遇到一个系统时钟tick就会调用一次usrClock()函数。
仿真器不支持对此中断函数的调试,必须在目标板环境下调试。
具体步骤如下:
●启动并配置好FTP服务器,启动超级终端,给目标板上电,修改Boot参数,下载VxWorks映象
●在Tornado环境中启动相应的目标服务器,启动调试器
●在Debug下拉菜单选择Attach|system进入系统调试模式
●启动Shell,在Shell窗口中输入以下命令为usrClock()设置断点:
busrClock
●单击Continue,继续执行程序,会发现程序将停在usrClock入口的断点处
8文件组织
工作台的File窗口显示各工程包含的C文件,选中一个工程单击右键,在弹出菜单中选中Dependencies选项,可以将C文件中的自定义的头文件加到ExternalDependencies目录下。
但是编译器并不知道该头文件的具体位置,可以在该工程的Build|Properties窗口的C/C++Complier信息中添加-I命令行,将头文件的全路径告知编译器。
如附录中的tt.c文件中包含了一个自定义的hello.h头文件,为了方便文件的组织,此头文件与tt.c放在不同的目录中,这时在编译信息中增加行命令-ID:
/torProjects/Project1/h,编译器即可在此目录下找到hello.h文件。
如图5所示。
在File窗口中双击某个C文件或H文件,文件就会在Editor窗口打开。
附录
VxSim仿真器的使用
Tornado提供了一个VxSim仿真器用于开发无须使用硬件直接存取的应用程序模块。
在仿真器环境下的调试方法与使用实际单板调试是一致的。
缺省的仿真器配置支持双模式调试。
启动VxSim
单击TornadoLaunch工具栏的以上图标,就可以启动VxSim仿真器。
这时出现如图6所示的对话框。
VxSim缺省下载的VxWorks映象位于simpc目录下,此映象支持双模式调试。
用户也可以通过选中Custom-buildsimulator框选择自定义的VxWorks映象。
注意此映象基于的BSP应为simpc。
VxSim启动成功以后,会出现一个VxWorksSimulatorforWindows的窗口,程序中的printf语句会将信息打印到此窗口上。
在Tornado环境中将出现一个LaunchTargetServer窗口,表明VxSim自动加载了一个目标服务器,无需用户自己配置。
在Tornado环境中可以配置多个目标服务器,如用于VxSim的或是实际目标板,通过TornadoLaunch工具栏的下拉列表选择使用哪一种。
在VxSim上创建应用工程
创建用于VxSim环境的应用工程的步骤与创建基于目标板的应用工程一致,需要注意的是工程基于的工具链(toolchain)应选择SIMNTgun。
多任务调试源代码tt.c
#include"
vxWorks.h"
taskLib.h"
stdio.h"
hello.h"
voidTaskA(void)
{
BYTEchari;
i++;
printf("
HellofromTaskA\n"
);
}
voidTaskB(void)
BYTEi;
i++;
printf("
HellofromTaskB\n"
voidMultiTaskTest(void)
intnewTid;
/*newlycreatedtaskID*/
HellofromMutiTaskTest\n."
SpawninganewtaskcalledTaskA\n\n."
newTid=taskSpawn("
TaskA"
10,0,10000,(FUNCPTR)TaskA,
0,0,0,0,0,0,0,0,0,0);
if(newTid==ERROR)
ERROR:
taskdidnotspawn\n"
SpawninganewtaskcalledTaskB.\n\n"
newTid=t
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- VxWorks 调试 手段 方法 研究