1 适用范围
本文档适用于希望了解当前SylixOS的调试手段的工程师。
2 cdump 系统/应用异常调试手段
2.1 cdump简介
cdump 是SylixOS系统下的shell命令,用于系统/应用崩溃的信息记录。cdump可以将内核保存在堆中的异常信息显示出来并清空内核堆中的异常信息或者保存下来。
当系统/应用程序发生异常时,可以在系统命令行下输入 cdump -s 保存异常信息,异常信息将保存在/var/log/cdump/ 目录下,如图 2.1。
将异常信息显示出来使用cdump -c命令,如图 2.2。
- 应用崩溃未导致系统重启,可以通过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 所示;
可以通过进程上下文中信息比对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 所示:
5 死锁检测工具的使用
在IDE Device下,Launch Device 后,可以通过 Thread Pending列表查看到发生死锁的线程,死锁线程为红色,如图 5.1 ;
也可以在shell 命令行下输入 tp 命令,查看到死锁线程后缀为 pmutex,如图 5.2 所示:
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抓取数据包的示列:
12 参考资料
《RealEvo-IDE使用手册》
《SylixOS应用开发手册》
《SylixOS shell用户手册》
《RealEvo-Simulator使用手册》