sylixos异常调试的手段(代码片段)

author author     2022-12-24     664

关键词:

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使用手册》

sylixos的realevo-ide调试方法

1适用范围   本文档适用于已熟悉SylixOS并且使用RealEvo-IDE进行开发调试的技术工程师。2概述   SylixOS实现了一个功能强大的调试stub,可在设备或模拟器上在线调试应用程序,RealEvo-IDE也提供配套的调试插件。 &nbs... 查看详情

sylixos驱动调试软件使用说明

1.适用范围   本文档适用于使用SylixOS进行驱动模块开发的客户人员和技术工程师。2.工作准备   BSP驱动开发软件;   CAN驱动模块代码;   CAN应用程序测试代码。3.原理概述   ... 查看详情

tungstenfabricsdn—流量调试手段(代码片段)

...er)、VM(VNF)这3个层次,相对的有着3套工具来进行流量调试。ist.py$pipinstalllxmlprettytable$gitclonehttps: 查看详情

sylixos下的io系统调用(代码片段)

SylixOS标准I/O基本介绍1.1简介I/O系统又称作输入输出系统,SylixOS兼容POSIX标准输入输出系统,SylixOS的I/O概念继承了UNIX操作系统的I/O概念,认为一切皆为文件。与UNIX操作系统相同,SylixOS中的文件也分为不同的类型。1.2两种I/O类型I... 查看详情

sylixos屏蔽中断实现

1.CortexM7的异常掩码寄存器 1.1PRIMASK寄存器   PRIMASK寄存器可以屏蔽除NMI(不可屏蔽中断)与硬件fault(硬件错误)之外的所有异常。PRIMASK关中断的汇编代码如图11所示,PRIMASK开中断的汇编代码如图12所示。650)this.width=650;"... 查看详情

vxworks驱动移植至sylixos总结(代码片段)

本文档描述了将VxWorks中的驱动源码快速移植至SylixOS中的方法,使用时需要结合SylixOS中的VxWorks兼容层实现。1.驱动注册与初始化1.1VxWorks中驱动注册与初始化1.1.1初始化函数VxWorks中大部分函数使用了VxWorks的VxBus结构,对于基于VxBus... 查看详情

异常调试(代码片段)

抛出异常  在Python中,要想引发异常,最简单的形式就是输入关键字raise,后跟要引发的异常的名称。异常名称标识出具体的类: Python异常处理是那些类的对象。#当程序出现错误,python会自动引发异常,#也可以通过raise显... 查看详情

如何优雅的使用ideadebug进行调试(代码片段)

...使用到的一种排查问题的手段,我们用它来定位分析异常的出现,以及程序在运行中参数的变化。IDEA本身具有很强的调试功能,掌握IDEA的一些Debug技巧,对我们开发和排查问题的效率会有很大的提升1、IDEADebug基... 查看详情

sylixos钩子函数浅析(代码片段)

...错的选择。2钩子函数的原理本章以定时器中断为例说明SylixOS钩子的使用方法。2.1API_InterVectorIsr函数函数原型如程序清单2.1程序清单2. 查看详情

sylixos之epoll异常分析

1.SylixOSepoll介绍    SylixOS为了兼容Linux的epoll,创建了epoll的兼容子系统,并支持了epoll的部分功能。SylixOSepoll兼容子系统是由select子系统模拟出来的,所以效率没有select高。2.epoll异常分析2.1epoll异常场景  &nbs... 查看详情

sylixos之epoll异常分析

1.SylixOSepoll介绍    SylixOS为了兼容Linux的epoll,创建了epoll的兼容子系统,并支持了epoll的部分功能。SylixOSepoll兼容子系统是由select子系统模拟出来的,所以效率没有select高。2.epoll异常分析2.1epoll异常场景  &nbs... 查看详情

sylixos中aarch64跳转表实现原理(代码片段)

1.跳转表存在的意义1.1内核模块反汇编如下的程序清单,为一个内核模块的源码。#define__SYLIXOS_KERNEL#include<SylixOS.h>#include<module.h>/**SylixOScallmodule_init()andmodule_exit()automatically.*/intmodule_init(void)printk("h 查看详情

ideaidea调试技巧异常断点断点之前显示异常字段(代码片段)

1.概述除了阅读源码,一定是遇到了异常我们才开始调试代码,代码在抛出异常之后会自动停止,但是我们希望:代码停在抛出异常之前,方便我们查看当时的变量信息这时我们就用到了ExceptionBreakpoints,当抛出异常时,在catch的... 查看详情

sylixos驱动程序加载

SylixOS开发套件简介 SylixOS专用的集成开发环境是RealEvo-IDE。RealEvo-IDE是一套基于eclipse开发的SylixOS集成开发环境,包括一系列开发调试插件,提供完整的SylixOS嵌入式开发解决方案,集设计、开发、调试、仿真、部署、测试功能... 查看详情

前端监控之处理异常的正确姿势(代码片段)

前端异常一般来说,根据笔者的目前研究,前端异常大体上可以分为两类:由于对语法的不了解、机制的不清楚或是没有做好降级处理而“主动”造成的错误(多为js异常)和由于资源加载、第三方库、浏览器... 查看详情

sylixos中select原理及使用分析(代码片段)

1.select接口简介1.1select接口使用用例select是操作系统多路I/O复用技术实现的方式之一。多路I/O复用技术大致使用场景为:构造一张感兴趣的文件描述符列表,然后调用多路复用的IO接口,在接口中进行阻塞,直到这些描述符中的... 查看详情

pinvokestackimbalance调试异常的解决办法。(代码片段)

当用c#调用c++写好的dll时,调试过程中出现:pInvokeStackImbalance函数调用导致堆栈不对称。原因可能是托管的PInvoke签名与非托管的目标签名不匹配。code:c++dll(my-dll):extern"C"__declspec(dllexport)voi 查看详情

第三周作业

一、阅读笔记(介绍Sylixos性能特点)1.Sylixos简介SylixOS是一款为嵌入式系统设计的硬实时操作系统(RTOS)。此系统于2006年开始开发工作。设计之初只是为了验证相关操作系统算法,后来经过多年的持续开发与改进,SylixOS已经不只... 查看详情