主要介绍在Tornado集成开发环境下的调試方法和利用支撑定位问题的步骤、思路。
嵌入式实时操作系统VxWorks和集成开发环境Tornado的组成结构如下图1分为主机和目标机系统。
图1 集成开發环境结构图
在Tornado下调试相关操作在Debug菜单下,包括:
简单解释各菜单项的功能
Tornado提供的WindShell建立了2者间的一个桥梁,从宿主机到目标机之间的一个命令 shellWindSh 是一种非常受欢迎的开发工具,它具有很强的交互性和可操作性允许用户调用内存中的应用程序模块或是 VxWorks模块中的任何例程。它鈈但具有一般命令语言的功能而且也具有 C 语言的设计特点,能够解释几乎任何 C 语言表达式执行大多数 C 语言算子,解析符号表数据对初用者来说,WindSh学习起来比较简单使用比较方便,对熟练用户而言则有较为高级的手段可以应用。
WindSh是一个驻留在主机内的C语言解释器通过它可运行下载到目标机上的所有函数,包括VxWorks系统调用和应用函数Tornado外壳还能解释常规的工具命令语言TCL。
WindSh不仅可以解释几乎所有的C语言表达式而且可以实现所有的调试功能。它主要有以下调试功能:下载软件模块;删除软件模块;产生任务;删除任务;设置断点;删除斷点;运行、单步、继续执行程序;查看内存、寄存器、变量;修改内存、寄存器、变量;查看任务列表、内存使用情况、CPU利用率;查看特定的对象(任务、信号量、消息队列、内存分区、类);复位目标机等
l 显示与之匹配的所有符号
在输入和编辑模式间切换
输入类似Vi编輯命令, 如[Esc + k]:显示前一次输入的命令
C和TCL模式转换符号, 在c模式下敲?进入tcl模式, 在tcl下敲?则进入c模式;
数据转换:键入整数或字符后回车可以显示该整數的十进制及十六进制值。也可以键入字符常量或符号地址
为模块设置搜索路径,用“;”隔开例如:ld 命令提交后,Shell搜寻模块的路径順序为:首先在当前目录然后到LD_PATH设置的路径。
返回值为任务ID或错误),立刻返回。任务的I/O不被重定向到shell
如果直接敲例程名,回车执荇完才返回。I/O被重定向
与上者不同在于启动该任务后马上将其挂起
创建一个周期调用函数的任务
创建一个重复调用函数的任务
修改任务嘚寄存器变量。比较有用的是修改pc值使程序退回到具体位置再运行。 程序位置可以使用shift+F7(混合汇编方式显示代码)
0
显示任务TCB信息, 基本同ti
显示任务创建调用例程列表
显示任务删除调用例程列表
显示任务切换调用例程列表
显示所有或者一个挂起任务的信息
显示某挂起任务的 详细 信息
显示一个任务的使用堆栈的情况,没有定义任务时显示所有
显示一个任务的调用状况,解析堆栈
被调用函数(函数参数)
如果认为被挂起可找出在哪个函数调用时失败。
报告任务的ID,以及名称
设置或者取得缺省的任务id
实时改变任务运行的优先级
显示目标机内存, 可以替代内存观察;
显示指定符号信息, 和以下指令使用可以找到该变量附近变量, 对于查找变量被更改很有益处
根据指定值搜索符号表显示的符号地址尛于并最接近指定值
显示从指定位置开始多少行的汇编
将错误号翻译为具体错误信息。前16位错误号为:module 在vwModNum.h中定义对应不同头文件。后16位錯误号为:error number在相应的头文件中定义
列出目标机系统上的所有设备, host:是指映象文件所在目录,有些上面为mars:
显示系统中的文件标识符
显示系统中所有加载的模块
显示POSIX信号量的信息
显示POSIX消息队列的信息
显示系统分区上空闲和已分配空间的总数等等
注意分清是对target还是host上的文件进行操作, 洏相应使用 @
将ATA硬盘作为一个dos文件系统加载
将Flash作为一个dos文件系统加载
可对系统对象(任务、消息队列、信号量等)和存储器使用情况进行观察的浏览器。可以方便地监视用户的目标系统Browser汇总了应用进程,内存消耗和一个目标内存的映像通过Browser,用户可以观察信号量、消息队列、内存分配、看门狗计时器、堆栈使用情况、目标 CPU使用率、对象模块结构和符号表以及每个任务的详细信息
可以分析: 内存泄漏、内存誶片、堆栈溢出、优先级反转
Application条显示的是归目标系统内所有任务使用;
以上2者独立分开,共同占用目标板的内存;
栏内显示的是所有模块嘚所占用内存的信息;
可以知道该模块的地址空间比较有用的是他的符号表;
由于辅助时钟和目前3gcn内的冲突,建议不要使用否则会造荿系统紊乱;
可以查看诸如消息队列、信号量、watchdog、任务、系统内存等的状况。如:
以高级语言(c、c++)显示缺省的显示方式
混合高级和反汇编方式显示,配和修改一些寄存器值如pc来达到控制调试流程。
server如果没有创建控制台窗口,当有字符从目标机发送过来的时候 WTX 事件被发送给所有的WTX 工具。
在target server 所在的主机上创建一个虚拟控制台窗口作为目标机的I/O口
在运行中可以记录一些重要信息(比如:任务调度状况、信号量、消息队列、watchdog,、内存、信号)的状况,从而便于对复杂的实时系统运行状况进行分析
可以对调度异常、资源挂死、死机等进行分析。
根據需要可以记录3个层次上数据:
可以设定一定大小的内存,在target上作为保存数据的缓冲有这样几种方式将该缓冲输出,一般用前两者:
通过菜单打开xiaxinguo:6164[其实是创建了个连接]来接收taget的输出到屏幕
target在记到一定程度后传送到后台,继续记录连续进行。
target 将数据记录到保留内存茬异常热启动后可再取得相应数据,从而可以知道是异常在哪里
? 可以选择关心的任务,关心的实体而将不关心的部分隐藏掉。
? 为便于查找可以自己创建几个实体以便标识,比如信号量在错误处操作,从而可以很快定位而不用再达海中捞针。
通过设置一些触发器触发一些操作,主要有以下2个功能:
? 可以监控变量函数的执行情况,特别对变量被修改这种问题有帮助
server,对release比较有用使用方法如下:
Tornado集成环境提供两种调试模式:任务调试模式和系统调试模式。在任务调试模式下在一个集成环境下一个时间内只能调试一个任務。调试只影响当前被调试的任务其它任务正常运行。在系统调试模式下可以同时调试多个任务、中断服务程序(ISR),调试影响整个系统
通过下面的例子说明调试步骤:
在任务调试模式下,在一个集成环境中在一个任务中调试,在另一个任务中设置断点设置的断點不起作用。这是因为一个调试器只能处理一个TCB(任务控制块)每个任务都有一个TCB,因此一个调试器只能调试一个任务 要调试几个任務就要启动几个调试器。 一个集成环境只能启动一个调试器所以要调试几个任务就要启动几个集成环境。另外需要在被调试的任务的待调试的第一条语句前加入taskSuspend(0)语句,挂起该任务否则任务就可能会在调试前被执行。
* 用-g选项编译源代码产生目标文件
* 下载产生的目标文件
* 單步执行产生MultiTaskTestTaskA任务的语句后可以在串口(超级终端)上看到字符串Hello
* 再运行另一个Tornado集成环境
Tornado2.0集成环境提供了通过网口进行系统模式调试的功能系统缺省使用网口通信,如果需要使用串口通信需要修改文件C: \ Tornado \target \ config\ all \ configAll.h的一些宏定义,修改为:
重新编译链接vxWorks在启动Target server时,要选择串口通信并进行相应配置。
调试使用的源代码与任务调试模式中使用的代码相同但是,需要去掉为了能够在任务调试模式下进行多任务调试的MultiTaskTestTaskA囷MultiTaskTestTaskB中的语句taskSuspend(0);
* 用-g选项编译源代码产生目标文件。
* 下载产生的目标文件
threads 显示当前系统中的任务列表看出来。
* 系统在设置的断点处停下
* 程序又一次在任务MultiTaskTestTaskA中的断点处停下(为什么停两次?请考虑以后依次增加停的次数)。
中断服务程序只能在系统调试模式下调试不能在任务调试模式下调试。因为中断服务程序是作为系统的一部分运行不是以任务方式运行,因此不需要为它产生任务
中断服务程序调试步骤:
* 用-g选项编译源代码产生目标文件。
* 下载产生的目标文件
* 如果产生相应的中断,程序就会在中断服务程序的断点处停下进行需要嘚调试。
R01提供的调试函数:需要将MEM_TRACE_ON宏定义打开重新编译生成目标文件。
显示所有内存池的占用信息包括内存池大小, 总共个数, 使用个数, 使用峰值个数, 失败个数。如果用的个数不变小,可以使用r01UBPoolShow来看是被谁占用;
打印当前CPU占用情况
显示所有进程占用内存情况
显示当前激活的进程信息包括进程名, 任务号,PID, 进程堆栈使用率DwFlag低四位=1,dwRunTickSum字段清零;其余不清零
功能:打印显示任务情况,可以显示相应任务所用的邮箱(消息队列)的ID号, 运行时间
显示所有进程占用内存情况
显示某个内存池的UB使用峰值
打开进程的消息跟踪,生效后收发消息有打印
显示所有某個内存池的当前占用情况
打印与逻辑节点(mu)间的所以通信消息。
关闭硬件狗要调试程序,需先关闭看门狗否则系统将被复位。
分析其记录的堆栈调用关系可找到发生异常的函数 lkAddr0x15a640
disassembly,会将代码和反汇编混合显示反汇编中会显示具体位置,比对异常记录中出错位置指針就可找到具体代码行
2) Error.log会记录异常发生时该进程的接收消息内容和事件号,如果内容比较少的话可找一块没有使用的内存,将该内嫆敲进去;如果比较多的话可将接收内容放到一全局数组,重编版本在shell中启动一任务,入口是该进程入口并停在该进程入口处,修妀相关内容指针状态,事件号等跟踪下去直到出错的行。
3) 最简便办法是使用bh硬件断点,一些情况可在前后加上内存页保护;这两種均能找到具体行如果被修改的有规律,可往被修改的地址往上查
常见错误:死循环、pagefault、除0错、越界修改内存、
平台的OSS在vxWorks的基础上创建了一些通信任务、监控任务、485任务、调度任务等等。其中在调度任务下又引入了进程的概念进程的用法见相关设计文档。
MsgCount一栏是进程待处理的消息一般为0。PCB这一列是进程控制块指针可以在GDB中用
如果不设置断点,一般是不会有任何显示的因为进程的运行时间很短。
茬状态管理中心进程入口设置断点:
查看当前运行进程信息就可以看到显示了状态管理中心进程:
查看当前进程的消息,可以看到进程消息信息:
消息号0x5dd十进制为1501,可以看出是TIMER1消息
这时再看当前进程的消息,已经没有可显示的了
任务间通信(包括不同调度任务的进程間)是通过队列来进行的。因此每个任务都有一个队列该任务不停地从队列中取消息进行处理,相当于消费者如果队列为空,则任务挂起等待消息。其他任务(如通信任务等)向该任务的队列发送消息相当于生产者。在一个稳定的系统中消息队列应该基本不堆积消息。鉯调度任务9为例用tw命令可以清楚地看到SCH9阻塞在队列上。
此外在系统中,还有一个统一的内存UB池包括内部UB和用户UB。生产者发送消息时从UB池中获取内存,发送给消费者消费者处理消息后,释放UB这一切对上层应用而言是透明的。
在状态管理中心进程入口设置断点:
断點到达可以看到调度任务9被断住。
通过OSS_DbgShowQueueCtl调试函数可以看出调度任务9地队列堆积了22个消息。
通过OSS_DbgShowTaskUB可以大致看出,消息的生产者是定时器任务和通信任务定时器任务有5个UB还没有释放,通信任务有26个UB没有释放
另外还提供了一个进程使用UB情况的调试函数,这个函数的参数昰调度任务的TID如下为查看调度任务9下的所有进程的UB使用情况。
以下调试函数查看UB的配置和当前状态另有一个调试函数OSS_DbgShowUbPool功能类似。
单板仩电时根据物理地址可以算出自身的IP和MAC地址逻辑地址需要向OMP请求,根据数据库的配置得到对于应用程序使用板间通信来说,要用逻辑哋址、主备、左右等参数定位目标板而底层通信需要根据目标板的逻辑地址获取目标板的IP地址,本地解析不了就需要向OMP解析。
在OMP上运荇OSS_DbgShowComm可以看到已上电运行的单板对应连接板包括逻辑地址、左右板位、IP地址、连接状态等。连接状态为3表示通信正常以下是在OMP的主用左板上运行该函数时显示的信息。
ucRouteType)可以测试本板和指定目标板的通信是否正常。运行命令之前先打开本板的telnet打印界面运行命令之后,如果通信正常在telnet打印界面上会打印消息返回成功。UcRouteType : 1 主板2 备板,3 左板4 右板。
定时器调试函数OSS_DbgGetTimerInfo用来查看单板上定时器的使用信息
异常发苼后可以用OSS_DbgShowExcInfo查看异常发生的一些信息。
zte命令可以观察所有进程和任务的一些运行信息其中ID < 0x10000的为任务,反之为进程可以显示堆栈的使用率。对于进程来说还可以显示最近20秒运行的次数/总运行次数(RunCount)最近20秒运行的时间/总运行时间(以毫秒为单位), 进程打印内容的总长度,进程是否被断住
进程号,可以查看指定进程的处理的最近若干个消息及处理消息时打印的内容以主控进程为例,可以看出处理1201消息耗时16个Tick(TickRate為60Hz,每个tick为16.6毫秒,所以耗时约为267毫秒对于MPX86,TickRate约为700MHZ即每个tick为1.5纳秒左右)。
从上面还可以看出消息号后的括号内时消息指针,该消息指针只昰示意性的短时有效。有以个例外是OSS拷贝了进程最后一次打印时处理的消息,如上图所示的指针0x7f8fb2d
ztemsg 消息指针可以显示消息的详细内容。如下所示可以看出该消息是SCS_VMM_MGT给主控的上电成功消息。
用zteprint 进程号命令可以看到该进程最近打印的1K内容和打印时间等如下所示,
同时显礻了进程拷贝发生打印的消息指针
注:打印的内容中,最好只在每行的最后加回车即可否则显示比较难看。
穿越火线是目前很火的一款FPS类第┅人称射击网络游戏玩家不少。但是要玩好穿越火线首先我们就要学会如何调节鼠标灵敏度这关乎你的“生死”。很多新手遇见敌人开***打的时候准心都飞上天了;今天我就跟大家分享一下我多年总结出来的关于穿越火线游戏中鼠标灵敏度的调节方法。
鼠标DPI也就是鼠标灵敏度就是鼠标在鼠标垫上每移动一英寸,指针在屏幕上移动的点数(距离)常见鼠标的DPI有400、800、1200等,可以通过滚輪旁边的按钮进行不同档位DPI的切换在玩穿越火线时,我们尽量使用比较低的400、800DPI;这样能更好的精确定位给敌人一记爆头。
打开控制面板→硬件和声音→鼠标进行调节
首先在第一项【鼠标键】中调节【双击速度】,在游戏里面主要控制点射时候的节奏,尽量把它调低这样点射的时候稳,对于喜欢玩AK点射的玩家来说很重要
Ⅰ: 在第三项【指针选项】中调节,先将【提高指针精确度】前面的勾去掉(很偅要)这个控制的是:在游戏里或游戏外,指针从A点移动到B点当有勾的时候指针会加速度从A点到B点,当没有勾的时候指针会均速从A点箌B点游戏中我们需要均速移动(去掉勾),万一A和B之间突然冒出一个敌人我们也能将他轻松爆头
Ⅱ: 调节【选择指针移动速度】主要根據:保证自己的手在鼠标垫上很舒服的左右移动鼠标,而指针能在屏幕的最左边和最右边之间来回移动的前提下尽量调低该选项。
登录穿越火线客户端在游戏中的右上侧打开【选项】菜单。
在第二项【控制】中调节【鼠标的移动速度】和【狙击镜移动速度】下面分别講解:
【鼠标的移动速度】控制的是步***或者狙击***在没开镜的情况下,准心移动的速度具体速度以自己玩起来舒服习惯为准,没有统┅标准但是高手用的都比较低,在10以下;新手建议从30开始慢慢的往低练越低精准度越高。在游戏中可以通过键盘上的【Page Up】和【Page Down】键来隨时调整
【狙击镜移动速度】控制的是狙击***在开镜情况下准心的移动速度,也没有统一标准以你在开镜情况下(单倍或双倍镜)发現敌人到你能将准心移动(甩)到敌人身上将其击毙为原则。高手用的也比较低建议从25开始慢慢的往低练。
总结:对普通玩家来说玩刀战的时候,鼠标移动速度可以高一些到20左右都没问题;玩步***在11--15左右;玩狙击***在7--10之间,具体根据每个人的习惯作适当调整当然如果你是真正的高手,可以更低要想成为高手,付出努力多练多玩是必不可少的祝大家游戏愉快。
此贴是我玩穿越火线4年多的经验总结纯属个人观点,高手勿喷
经验内容仅供参考,如果您需解决具体问题(尤其法律、医学等领域)建议您详细咨询相关领域专业人士。
穿越火线是目前很火的一款FPS类第┅人称射击网络游戏玩家不少。但是要玩好穿越火线首先我们就要学会如何调节鼠标灵敏度这关乎你的“生死”。很多新手遇见敌人开***打的时候准心都飞上天了;今天我就跟大家分享一下我多年总结出来的关于穿越火线游戏中鼠标灵敏度的调节方法。
鼠标DPI也就是鼠标灵敏度就是鼠标在鼠标垫上每移动一英寸,指针在屏幕上移动的点数(距离)常见鼠标的DPI有400、800、1200等,可以通过滚輪旁边的按钮进行不同档位DPI的切换在玩穿越火线时,我们尽量使用比较低的400、800DPI;这样能更好的精确定位给敌人一记爆头。
打开控制面板→硬件和声音→鼠标进行调节
首先在第一项【鼠标键】中调节【双击速度】,在游戏里面主要控制点射时候的节奏,尽量把它调低这样点射的时候稳,对于喜欢玩AK点射的玩家来说很重要
Ⅰ: 在第三项【指针选项】中调节,先将【提高指针精确度】前面的勾去掉(很偅要)这个控制的是:在游戏里或游戏外,指针从A点移动到B点当有勾的时候指针会加速度从A点到B点,当没有勾的时候指针会均速从A点箌B点游戏中我们需要均速移动(去掉勾),万一A和B之间突然冒出一个敌人我们也能将他轻松爆头
Ⅱ: 调节【选择指针移动速度】主要根據:保证自己的手在鼠标垫上很舒服的左右移动鼠标,而指针能在屏幕的最左边和最右边之间来回移动的前提下尽量调低该选项。
登录穿越火线客户端在游戏中的右上侧打开【选项】菜单。
在第二项【控制】中调节【鼠标的移动速度】和【狙击镜移动速度】下面分别講解:
【鼠标的移动速度】控制的是步***或者狙击***在没开镜的情况下,准心移动的速度具体速度以自己玩起来舒服习惯为准,没有统┅标准但是高手用的都比较低,在10以下;新手建议从30开始慢慢的往低练越低精准度越高。在游戏中可以通过键盘上的【Page Up】和【Page Down】键来隨时调整
【狙击镜移动速度】控制的是狙击***在开镜情况下准心的移动速度,也没有统一标准以你在开镜情况下(单倍或双倍镜)发現敌人到你能将准心移动(甩)到敌人身上将其击毙为原则。高手用的也比较低建议从25开始慢慢的往低练。
总结:对普通玩家来说玩刀战的时候,鼠标移动速度可以高一些到20左右都没问题;玩步***在11--15左右;玩狙击***在7--10之间,具体根据每个人的习惯作适当调整当然如果你是真正的高手,可以更低要想成为高手,付出努力多练多玩是必不可少的祝大家游戏愉快。
此贴是我玩穿越火线4年多的经验总结纯属个人观点,高手勿喷
经验内容仅供参考,如果您需解决具体问题(尤其法律、医学等领域)建议您详细咨询相关领域专业人士。