SylixOS异常调试的手段

1 适用范围

本文档适用于希望了解当前SylixOS的调试手段的工程师。
2 cdump 系统/应用异常调试手段

2.1 cdump简介

cdump 是SylixOS系统下的shell命令,用于系统/应用崩溃的信息记录。cdump可以将内核保存在堆中的异常信息显示出来并清空内核堆中的异常信息或者保存下来。

2.2 cdump的使用方法

当系统/应用程序发生异常时,可以在系统命令行下输入 cdump -s 保存异常信息,异常信息将保存在/var/log/cdump/ 目录下,如图 2.1。

[点击并拖拽以移动]

                                                                                  图 2.1保存异常信息

将异常信息显示出来使用cdump -c命令,如图 2.2。

[点击并拖拽以移动]

                                                                                  图 2.2显示异常信息

2.3 cdump注意事项

应用崩溃未导致系统重启,可以通过cdump保存和显示系统/应用异常信息。
当出现异常造成shell无法使用的情况下,可以掉电重启系统,启动后通过cdump -s和cdump -c 保存/显示异常信息。
当系统由于异常造成崩溃重启,一般情况下无法使用cdump命令保存/显示异常信息。
如果出现系统崩溃重启且无法用cdump显示异常,优先考虑栈溢出的可能,使用shstack new stack size 调大栈空间后,重新运行。

3 上下文打印信号

SylixOS下可以通过kill 命令打印进程和线程上下文,在 shell 命令行下输入ts命令,查看该进程或线程的pid/tid 值,再在shell命令行下输入 kill -n -47 [pid/tid],如图 3.1 所示;

                                                                               图3.1 上下文打印信号

可以通过进程上下文中信息比对objdump反汇编出来汇编代码,分析程序。
4 objdump反汇编操作

在IDE下可以利用IDE安装目录下的 xxx-objdump.exe 工具对可执行文件进行反汇编操作;下面以elf文件test为例详细介绍:

objdump -f test :显示test的文件头信息;
objdump -d test :反汇编test中的需要执行指令的那些section;
objdump -D test :与-d类似,但反汇编test中的所有section;
objdump -h test :显示test的Section Header信息;
objdump -x test :显示test的全部Header信息;
objdump -s test :除了显示test的全部Header信息,还显示他们对应的十六进制文件代码;
objdump -S test :尽可能反汇编出源代码,尤其当编译的时候指定了-g这种调试参数时,效果比较明显。隐含了-d参数。

具体操作流程:

1,将xxx-objdump.exe 工具和可执行文件放在一个文件夹下;

2,在该文件夹下打开cmd,进入该目录,输入xxx-objdump.exe [option] 可执行文件 >> 重定向文件,如图 4.1 所示:

                                                                                     图 4.1 objdump使用演示

5 死锁检测工具的使用

在IDE Device下,Launch Device 后,可以通过 Thread Pending列表查看到发生死锁的线程,死锁线程为红色,如图 5.1 ;

                                                                                    图 5.1 IDE死锁检测

也可以在shell 命令行下输入 tp 命令,查看到死锁线程后缀为 pmutex,如图 5.2 所示:

                                                                                              图5.2 shell死锁检测

6 RealEvo-IDE调试

使用RealEvo-IDE 可以在设备或模拟器上在线调试应用程序,目前有以下几种方式:

一键推送调试;
手动启动调式;
通过串口调试;
动态库调试;
Attach 到进程;
Non-stop 模式;
内核调试。

具体调试方法可以参考《RealEvo-IDE使用手册》第五章内容以及《RealEvo-Simulator使用手册》第2.8节、2.9节。
7 部分shell调试

可以在系统命令行下,查看系统/应用程序状态,有如下几种:

内存泄漏检查:leakchk、leakchkstart、leakchkstop;
显示系统当前的内存信息:free;
查看线程和中断堆栈的使用情况:ss;
查看cpu的使用率:top;
查看系统中断向量表信息:ints;
查看系统内核内存堆与系统内存堆使用情况:mems;
显示或设置当前内核日志打印等级:loglevel;
显示或者设置shell任务堆栈大小:shstack;
查看网络状态:netstat;
显示当前操作系统异常处理统计信息:aborts。

具体命令的使用可以参考《SylixOS shell用户手册》。
8 打印寄存器内容

在SylixOS下如果要将寄存器中的值打印出来, 需要移植工具到系统下以及该寄存器地址须映射到系统下,工具如下:

向寄存器中写数据 mw [b/w/l] 寄存器地址value 大小(b/w/l分别表示 2字节、4字节、8字节操作的意思)
读取寄存器中的数据 md [b/w/l] 寄存器地址 value 大小。

9 调试函数

SylixOS可以将在shell 命令行下输入系统函数名去调试该函数。
10 Syslog服务器及系统日志

RealEvo-IDE支持Syslog 服务,具体使用方法可参考《RealEvo-IDE使用手册》第6.6节;

系统日志(需要在bsp将kdlog的值改为yes),在系统启动会在串口下打印内核信息。
11 网络调试

SylixOS下提供对网络包的抓取及分析工具tcpdump,tcpdump采用命令行方式,它的命令大致如下,具体的各种使用方法可以在网上参考linux下tcpdump的用法:

tcpdump [ -AbdDefhHIJKlLnNOpqStuUvxX# ] [ -B buffer_size ]

           [ -c count ]

           [ -C file_size ] [ -G rotate_seconds ] [ -F file ]

           [ -i interface ] [ -j tstamp_type ] [ -m module ] [ -M secret ]

           [ --number ] [ -Q in|out|inout ]

           [ -r file ] [ -V file ] [ -s snaplen ] [ -T type ] [ -w file ]

           [ -W filecount ]

           [ -y datalinktype ] [ -z postrotate-command ] [ -Z user ]

           [ --immediate-mode ]

       [ expression ]

参数含义:

-A

以ASCII格式打印出所有分组,通常用来抓取www的网页数据包数据。

-c

在收到指定的数量的分组后,tcpdump就会停止。

-C

在将一个原始分组写入文件之前,检查文件当前的大小是否超过了参数file_size 中指定的大小。如果超过了指定大小,则关闭当前文件,然后在打开一个新的文件。参数 file_size 的单位是兆字节(是1,000,000字节,而不是1,048,576字节)。

-d

将匹配信息包的代码以人们能够理解的汇编格式给出。

-dd

将匹配信息包的代码以c语言程序段的格式给出。

-ddd

将匹配信息包的代码以十进制的形式给出。

-D

打印出系统中所有可以用tcpdump截包的网络接口。

-e

在输出行打印出数据链路层的头部信息,也就是使用数据链路层的MAC数据包数据来显示.

-f

将外部的Internet地址以数字的形式打印出来。

-F

从指定的文件中读取表达式,忽略命令行中给出的表达式。

-i

指定监听的网络接口。

-l

使标准输出变为缓冲行形式,可以把数据导出到文件。

-L

列出网络接口的已知数据链路。

-b

在数据-链路层上选择协议,包括ip、arp、rarp、ipx都是这一层的。

-n

不把网络地址转换成名字。

-nn

不进行端口名称的转换。

-N

不输出主机名中的域名部分。例如,‘nic.ddn.mil‘只输出’nic‘。

-t

在输出的每一行不打印时间戳。

-O

不运行分组分组匹配(packet-matching)代码优化程序。

-P

不将网络接口设置成混杂模式。

-q

快速输出。只输出较少的协议信息。

-r

从指定的文件中读取包(这些包一般通过-w选项产生)。

-S

将tcp的序列号以绝对值形式输出,而不是相对值。

-s

从每个分组中读取最开始的snaplen个字节,而不是默认的68个字节。

-T

将监听到的包直接解释为指定的类型的报文,常见的类型有rpc远程过程调用)和snmp(简单网络管理协议)。

-t

不在每一行中输出时间戳。

-tt

在每一行中输出非格式化的时间戳

-ttt

输出本行和前面一行之间的时间差。

-tttt

在每一行中输出由date处理的默认格式的时间戳。

-v

输出一个稍微详细的信息,例如在ip包中可以包括ttl和服务类型的信息。

-vv

输出详细的报文信息。

-w

直接将分组写入文件中,而不是不分析并打印出来。

-X

可以列出16进制以及ASCII的数据包内容,对于监听数据包内容很有用。

图 11.1 对网口en1抓取数据包的示列:

[点击并拖拽以移动]

                                                                                         图11.1 tcpdum示列

12 参考资料

《RealEvo-IDE使用手册》

《SylixOS应用开发手册》

《SylixOS shell用户手册》

《RealEvo-Simulator使用手册》

原文地址:http://blog.51cto.com/13927802/2162449

时间: 2024-10-12 07:57:51

SylixOS异常调试的手段的相关文章

SylixOS串口调试详解

目录 1. SylixOS串口调试介绍    1 1.1    SylixOS串口的介绍    1 1.2    SylixOS串口调试介绍    1 2. SylixOS串口调试步骤    1 3. 总结    4 4. 参考资料    4 SylixOS串口调试介绍 SylixOS串口的介绍 串口(串行接口)也称也称串行通信接口或串行通讯接口(通常指 COM接口),是采用串行通信方式的扩展接口.串行接口 (Serial Interface) 是指数据一位一位地顺序传送,其特点是通信线路简单,

FrameWork:序列化和反序列化以及异常调试

1.序列化序列化:串行化 对象持久化 将对象存储到文件或数据库的字段中反序列化:将文件恢复成对象作用:1.永久保存数据2.传递数据 要序列化的对象对应的类以及类的属性.子类必须是可序列化的 要序列化的对象对应的类以及类的属性.子类必须是可序列化的 实现序列化反序列化需要引用命名空间: Using system.runtime.seralization.formatters.binary; Runtime 运行时 serialization 序列化 Formatters 格式化程序,格式器 Bin

SylixOS 驱动调试软件使用说明

1.适用范围 本文档适用于使用SylixOS进行驱动模块开发的客户人员和技术工程师. 2.工作准备 BSP驱动开发软件; CAN驱动模块代码: CAN应用程序测试代码. 3.原理概述 翼辉BSP驱动开发软件是一种用于调试驱动程序的软件库,它通过替换系统IO接口,利用软件库内的中间线程做中转,将内核态的驱动程序构建为用户态,使驱动程序的调试如普通应用程序一样简单. 4.使用说明 下面以AM4378板卡的CAN设备驱动为例,说明BSP驱动开发软件的使用过程.使用步骤如下: 4.1构建用户态驱动工程

异常调试

抛出异常 在Python中,要想引发异常,最简单的形式就是输入关键字raise,后跟要引发的异常的名称.异常名称标识出具体的类: Python异常处理是那些类的对象. #当程序出现错误,python会自动引发异常, # 也可以通过raise显示地引发异常. # 一旦执行了raise语句,raise后面的语句将不能执行. def boxprint(symbol,length,height): if len(symbol)!=1: raise Exception('Symbol Wrong') #

SylixOS异常管理

异常管理 SylixOS提供了一种平台无关的异常管理方法.当系统产生了写时拷贝.缺页等MMU访问失效异常或其他种类异常时,SylixOS会在异常中构建异常处理线程执行陷阱,在异常退出后的任务上下文中进行异常处理,完成所有的页面操作,如果操作失败线程将自我销毁.当为缺页中断等一般异常时,陷阱执行完毕后,系统将回到刚刚访问内存并产生异常的那条指令.其函数接口如下所示. LW_API VOID API_VmmAbortIsr (addr_t ulRetAddr, addr_t ulAbortAddr,

6.Swift协议|扩展|访问权限|异常调试|类型转换|运算函数|ARC|类类型初试化器|值类型初始化器

1. 协议(Protocol):与OC之间唯一不同的是Swift中的协议不管是属性还时方法全部是必须实现的 /** protocol*/ protocol FullNamed { /** 计算属性申明,只读的计算属性*/ var fullName:String { get } } /** 实现协议*/ struct Person:FullNamed { /** 实现协议  可以把计算属性实现为存储属性,更改其本身的性质*/ var fullName: String = "abc" }

通达OA 一个数据循环输出程序异常调试的案例

今天,通达OA二次开发交流群里有一个朋友问这样一个问题,通过代码连接数据库后,可以正常显示数据库中的数据,但是循环输出的代码只能输出单行数据,数据表里实际有多条数据,是什么原因导致循环失败的呢? <? include_once("inc/conn.php"); // 如需要连接数据库则包含 include_once("inc/utility_all.php"); // 如需要使用公用函数则包含 include_once("inc/check_type

tangram2.6(XE2)\framework框架加载包异常 调试的地方

添加以下的项目到项目组中, \tangram2.6(XE2)\framework\Core\Tangram_Core.dpk 调试此包的SysModuleMgr.pas的函数,本人还没有测试 function TTangramModule.LoadModule: THandle; begin try Result:=0; case GetModuleType of mtBPL:Result:=SysUtils.LoadPackage(self.FModuleFileName); mtDLL:Re

cgitb--CGI跟踪模块(简化异常调试)

通过启动cgitb模块,可以在web浏览器窗口查看详细的编码异常信息,而不必不停地跳转到web服务器的日志屏幕查看,更方便的定位问题: 异常解决后需关闭CGI跟踪. 在CGI脚本最前面增加如下两行,启动python的CGI跟踪技术: import cgitb cgitb.enable()