vxworks 调式

1,boot操作相关

串口命令行重启回车进入boot:

查看boot版本:v

更新: c    @

升级设备: w

运行: g

 

2, 代码:

2.1添加命令行:

    DEFUN,

    install_element

 

2.2 VxWorks使用

    i:查看任务;

    memShow:查看内存情况;

   tt:查看堆栈信息;

 

 

3,测试

3.1 信令跟踪测试步骤:

    设置局VLAN,指定上联端口,VID;

    设置NGN及上联数据;

    连接上联端口到MGC服务器,服务器脚本设置与NGN中设置一致;

    设置ONU语音带宽;

    设置ONU FX端口,电话号码,VID;

    打开信令跟踪开关(地址为ONU IP, H.248端口为2944)

 

4,测试工作步骤

先检查设备连线情况;

再检查设备版本是否为最新;

检查主备盘情况及IP地址等信息;

 

5,编程问题

运行出现memPart Free ,invalid block, 在网上搜表明是一个非法的内存块导致任务挂起。

这是一篇很详细的文章:

http://blog.rogerz.cn/archives/685

VxWorks中如果稍有不慎,就可能导致task suspend,如果运气好,shell没有被挂起,则可以通过系统的一些命令追踪一下挂起的原因。其中用到的主要命令是i、tt、ti、d等。

 

首先从出错信息开始:

0xfc8125b8 (t_Lcd): memPartFree: invalid block 0xfdfc6f38 in partition 0xfe508894.

由于memPartFree了一个非法的内存块,导致了任务挂起,我们需要确定到底是哪条语句导致了这个异常的产生,可能是什么原因引起的。

首先,需要通过“i”命令察看任务状态:

-> i

NAME        ENTRY       TID    PRI   STATUS      PC       SP     ERRNO  DELAY
---------- ------------ -------- --- ---------- -------- -------- ------- -----
tExcTask   excTask      fdffec80   0 PEND       fe3c5f50 fdffeb60   3006b     0
tLogTask   logTask      fdffc298   0 PEND       fe3c5f50 fdffc188       0     0
tShell     shell        fdf5fa48   1 READY      fe1f3afc fdf5f628       0     0
……
t_Lcd      fe392a30     fc8125b8 100 SUSPEND    fe1f24b0 fc8120b8   d0003     0
……

可以看到任务t_Lcd的状态为SUSPEND,即被挂起的状态。其他各项的含义都比较清楚,ENTRY是任务的入口函数,如果没有symbol,则直接显示地址,TID是任务的ID号,一般用任务的栈底地址表示,PC是当前的指令位置,SP是当前栈顶位置。

然后通过”tt”来追溯函数调用过程:

-> tt "t_Lcd"
fe3c14f4 vxTaskEntry    +68 : fe392a30 ()
fe392b48 initLcdComponent+2e8: fe392bdc ()
fe392bec initLcdComponent+38c: fe392bfc ()
fe39333c initLcdComponent+adc: lcdShowPassWord ()
fe398590 lcdShowPassWord+84 : saveModifiedSetting ()
fe3a3790 saveModifiedSetting+220: saveSettingValue (1)
fe1fd6d0 saveSettingValue+148: fe1fc428 (0, 5, ffffffff)
fe1fc888 getDeviceSettingValue+64c: fclose ()
fe1aab48 fclose         +ec : free ()
fe1bb7d4 free           +1c : memPartFree ()
fe1bb2dc memPartFree    +148: taskSuspend ()

我们可以了解到函数的调用过程,vxTaskEntry()?->fe392a30()->fe392bdc ()->fe392bfc ()->lcdShowPassWord ()->saveModifiedSetting ()->saveSettingValue (1)->fe1fc428 (0, 5, ffffffff)->fclose ()->free ()->memPartFree ()->taskSuspend ()。其他相关信息:第一栏是发生跳转(即函数调用)后的返回地址,稍后会作详细解释,第二栏是离返回地址最近的symbol和偏移量,一般情况下会是发起调用的那个函数的名称,除非该函数是内部函数,系统中没有symbol,第三栏是被调用的函数。

再来查看一下t_Lcd任务的栈里的内容,从前面的任务信息里已经得知当前栈顶位置为fc8120b8,通过“d”命令显示该地址的内容。

-> d 0xfc8120b0
fc8120b0:  fc81 25b8 fc81 25b8 fc81 20c8 fe1f 24b0   *..%...%... ...$.*
fc8120c0:  fe50 8894 fdfc 6f30 fc81 20e8 fe1b b2dc   *.P....o0.. .....*
fc8120d0:  fdf2 6b08 0000 0100 0000 000c 0000 0000   *..k.............*
fc8120e0:  0000 0000 fdf1 ed80 fc81 20f8 fe1b b7d4   *.......... .....*
fc8120f0:  fd9a 3538 fdf1 ed80 fc81 2108 fe1a ab48   *..58......!....H*
fc812100:  fd9a 3538 fc81 2108 fc81 2238 fe1f c888   *..58..!..."8....*
fc812110:  0000 0000 0000 0005 ffff ffff 0000 0600   *................*
fc812120:  0000 000a fdf1 ed80 4230 312e 7874 6373   *........B01.xtcs*
fc812130:  5f62 7566 2e69 6c32 0000 0000 0000 0000   *_buf.il2........*

这里我们可以看到一些熟悉的地址,注意看最后两列,在这里可以找到”tt”中显示的第一栏地址即函数调用的返回地址。两个返回地址之间是该函数的栈空间,用于保存栈指针、局部变量或者相关寄存器的值。要具体了解这些值是怎么来的,就要用到反汇编了。

反汇编通过objdump命令来实现,不同类型的cpu会有不同的可执行文件,例如

objdumpppc -D vxworks >xx.s

反汇编的结果可能会很大,耐心等待吧。我们来看一下fclose()里调用free()的这一过程,在汇编代码里查找返回地址fe1aab48。

fe1aaa5c <fclose>:
……
fe1aab44:   48 01 0c 75     bl  fe1bb7b8 <free>
fe1aab48:   38 00 00 00     li  r0,0

bl是无条件跳转指令,free()执行完之后,应返回fe1aab48继续执行。

查找fe1bb7b8,看看free被调用时干了些什么?

fe1bb7b8 <free>:
fe1bb7b8:   94 21 ff f0     stwu    r1,-16(r1)
fe1bb7bc:   7c 08 02 a6     mflr    r0
fe1bb7c0:   90 01 00 14     stw r0,20(r1)
fe1bb7c4:   7c 64 1b 78     mr  r4,r3
fe1bb7c8:   3c 60 fe 51     lis r3,-431
fe1bb7cc:   38 63 88 94     addi    r3,r3,-30572
fe1bb7d0:   4b ff f9 c5     bl  fe1bb194 <memPartFree>
fe1bb7d4:   80 01 00 14     lwz r0,20(r1)
fe1bb7d8:   7c 08 03 a6     mtlr    r0
fe1bb7dc:   38 21 00 10     addi    r1,r1,16
fe1bb7e0:   4e 80 00 20     blr

虽然不同类型cpu的汇编指令不同,但还是可以大致猜出其中的含义。stwu指令将r1保存到地址(r1-16)位置,然后让将r1减去16保存到r1中,完成了保存并更新栈指针的过程;第2、3条语句将返回地址保存到r1+20的位置;下面几条语句实际上是准备参数的过程,r3,r4一般用来保存函数的形参值,随后调用了memPartFree。从memPartFree返回后,先从堆栈上读取返回地址,然后将栈顶下移16字节,即恢复到原来的位置,最后跳转到返回地址。

对着内存内容校验一下,fclose调用free后的返回地址为fe1aab48,按照上面的分析,这个地址会被free()函数保存在r1+20的位置,因此r1+20=fc8120fc,r1=fc8120e8,而free中将r1减去了16,所以刚进入free()时,r1应该等于fc8120f8,这个数值会被保存在fc8120e8处,事实正是如此。

这里栈内空间的利用有点交叉混杂,暂时没有弄的太明白,并且free()中没有用到过fc8120f0-fc8120f8空间的内存,推测可能是栈的大小至少为16字节所以留空了,里面的内容是历史遗留产物,是否如此,还有待进一步的研究。

以上是比较通用的分析过程,本来还涉及到结合c代码的分析,跟具体的例子结合太紧密,就不赘述了,有一点可以提一下,想追溯函数调用过程中某一参数的运行值,可能会在调用者的栈中,也可能会在调用者的调用者的栈中,这个需要结合具体的汇编码来分析。因为函数的栈开辟出来是为了保存一些临时的乱七八糟的东西,比如需要用到r38,就会把r38临时保存到栈上,返回时再恢复。而对本函数有用的变量,通常会被优化到寄存器中保存,除非寄存器不够用了,才会用到栈空间。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/435870.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【转】[程序集清单定义与程序集引用不匹配]分析及解决

转自&#xff1a;https://www.cnblogs.com/shuangzimuchangzhu/p/8572817.html 什么是程序集清单(Assembly Manifest)? 我们知道&#xff0c;在.net中。程序是以程序集为单位进行打包的&#xff0c;通常一个.exe文件或一个.dll文件就是一个程序集。程序集一般包含了以下几个部…

dos如何修改远程服务器的密码,dos命令登入远程服务器

dos命令登入远程服务器 内容精选换一换远程桌面链接Windows云服务器报错&#xff1a;连接被拒绝&#xff0c;因为没有授权此用户账户进行远程登录。Windows远程桌面相关权限配置异常。在运行窗口输入secpol.msc&#xff0c;打开组策略编辑器打开"本地策略 > 用户权限分…

第二届(2009年)中国信息技术应用学术研讨会征文延期通知

第二届&#xff08;2009年&#xff09;中国信息技术应用学术研讨会征文延期通知 中国信息技术应用学术研讨会征文活动自开展以来&#xff0c;因其征文范围广、贴近科技需求&#xff0c;EI及ISTP检索率高&#xff08;第一届英文稿件达到100%&#xff09;&#xff0c;且正式出版论…

设计模式C++实现 ——状态模式

软件领域中的设计模式为开发人员提供了一种使用专家设计经验的有效途径。设计模式中运用了面向对象编程语言的重要特性&#xff1a;封装、继承、多态&#xff0c;真正领悟设计模式的精髓是可能一个漫长的过程&#xff0c;需要大量实践经验的积累。最近看设计模式的书&#xff0…

Apache在windows的设置

本节主要考虑windows的安装和配置使用&#xff0c;Linux 参考&#xff1a;http://httpd.apache.org/docs/2.2/stopping.html 一 Apache在windows的安装主要支持windows NT 86系统&#xff0c;安装文件或源代码下载页&#xff1a;http://httpd.apache.org/download.cgi。安装过程…

【转】正确认识动脉压力波形

转自&#xff1a;https://www.sohu.com/a/288192545_377325 前言 早在50多年前&#xff0c;就已经在麻醉患者中开始进行直接动脉血压监测。尽管对动脉压力波形的形态和细节进行分析可以给我们提供一些有用的诊断信息&#xff0c;但现代的医生似乎很少关注它。临床实践中的这些…

2008服务器ftp上传文件,win2008怎么开通服务器ftp上传

win2008怎么开通服务器ftp上传 内容精选换一换GPU加速型实例如需使用OpenGL/DirectX/Vulcan等图形加速能力则需要安装GRID驱动并自行购买和配置使用GRID License。此外&#xff0c;GRID驱动配合vDWS类型License&#xff0c;也支持CUDA&#xff0c;用来满足既需要计算加速也需要…

【转】温故之.NET 异步

转自&#xff1a;https://zhuanlan.zhihu.com/p/38537169 这篇文章包含以下内容 异步基础基于任务的异步模式部分 API 介绍 异步基础 所谓异步&#xff0c;对于计算密集型的任务&#xff0c;就是以线程为基础的多任务。而在具体使用中&#xff0c;使用线程池里面的线程还是新…

C库函数—strcpy实现

strcpy&#xff1a;将原串拷贝到目的串&#xff0c;不拷贝NULL 以下为具体实现&#xff1a; #include<stdio.h> #include<stdlib.h> #include<string.h> char * strcpy(char * strDest, const char * strSrc){ if(NULL strSrc || NULL strDest){ …

从数据库读写RadioButtonList选中的值

从数据库取出RadioButtonList选中的值 string str "体育";//这一项可以从数据库中读出 for (int j 0; j < this.RadioButtonList1.Items.Count; j) { if (str this.RadioButtonList1.Items[j].Text.ToString()) { this.RadioButtonList1.Items[j].Selected…

【转】DICOM中几个判断图像方向的tag

转自&#xff1a;https://www.cnblogs.com/h2zZhou/p/9072967.html 在DICOM标准里&#xff0c;有三个TAG与成像的方向相关。 参考来源&#xff1a;Kitware关于DICOM方向的说明 http://public.kitware.com/IGSTKWIKI/index.php/DICOM_data_orientation 包括 1、Image Positi…

贪心算法的几个应用

贪心算法具有2个性质&#xff1a; 1、贪心选择性质&#xff1a;只在当前状态下做最优选择&#xff0c;即局部最优选择&#xff0c;再自顶向下&#xff0c;去解做出这个选择后产生的相应子问题。每做一次选择&#xff0c;问题就转化为规模更小的子问题。对于一个具体问题&#x…

C#类和接口、虚方法和抽象方法及值类型和引用类型的区别

1.C#类和接口的区别 接口是负责功能的定义&#xff0c;项目中通过接口来规范类&#xff0c;操作类以及抽象类的概念&#xff01; 而类是负责功能的具体实现&#xff01; 在类中也有抽象类的定义&#xff0c;抽象类与接口的区别在于&#xff1a; 抽象类是一个不完全的类&#xf…

【转】DICOM医学图像读取涉及到的医学坐标体系

转&#xff1a;https://blog.csdn.net/sunyao_123/article/details/78975816 确定患者的位置和躺的方向主要有3个标签: (0018, 5100) Patient Position CS: ‘HFS’ (0020, 0032) Image Position (Patient) DS: [‘-167’, ‘-92’, ‘-28.5’] (0020, 0037) Image Orientatio…

学习 SQL 语句 - Select(4): 排序

Order By Asc|Desc本例效果图:代码文件:unit Unit1;interfaceusesWindows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,Dialogs, StdCtrls, ExtCtrls, Grids, DBGrids, DB, ADODB;typeTForm1 class(TForm)DBGrid1: TDBGrid;DataSource1: TDataSource;…

二叉树总结一

二叉树的知识点1&#xff1a; 二叉树存储结构 前序建立二叉树 前序遍历、中序遍历、后序遍历&#xff08;递归、非递归&#xff09; 二叉树节点总数 二叉树叶子节点数 二叉树深度 遍历二叉树第i层节点 分层遍历二叉树&#xff08;递归、非递归&#xff09; 求二叉树中节点的最大…

【转】Ubuntu 16.04 远程桌面

转自&#xff1a;实现Windows直接远程访问Ubuntu 18.04&#xff08;旧版本也支持,无需安装第三方桌面,直接使用自带远程工具&#xff09; - 法号阿兴 - 博客园 一、设置Ubuntu 16.04 允许进行远程控制 首先&#xff0c;我们先设置Ubuntu的远程控制&#xff0c;将其设置为允许被…

GridView应用整理

2009年5月31日下午 21:58:38 获取GridView中RowCommand的当前选中行索引 <asp:GridView ID"BookGridView" runat"server"><Columns><asp:BoundField DataField"id" HeaderText"图书编号" /><asp:BoundField Data…

【转】VNC不同软件之间的联系与区别

转自&#xff1a;http://www.52iot.net/book/net/76.mhtml 如果不是经常远程不建议使用VNC&#xff0c;毕竟比较耗资源 不建议使用vnc&#xff0c; 如果只是使用文件服务&#xff0c;可以通过ssh协议的客户端访问过去操作。 现在gnome&#xff0c;kde, unity都是内置的&#x…

二叉树总结二

二叉树基本知识点2&#xff1a; 二叉树的非递归后序遍历 前序遍历是&#xff1a;根、左、右&#xff0c;后序遍历是&#xff1a;左、右、根&#xff0c;观察发现&#xff1a;前序和后序刚好遍历顺序相反。由于非递归后序遍历需要保存根节点及第几次访问&#xff0c;比较麻烦。可…