本文已参与「新人创作礼」活动,一起开启掘金创作之路。
网络抓包
--- tcpdump
代码分析
--- gdb
--- pdb module
--- gdb(version>7)+python-debuginfo包
函数调用关系分析
cflow&tree2dotx&graphviz
--- cflow //分析源码,得到调用关系文本
--- tree2dotx //将文本格式转为dot
--- graphviz //将dot文件转为图片
代码统计
--- cloc
用户进程堆栈分析
--- gstack //gdb内置工具,查看进程堆栈信息
--- pstack //软链接,指向gstack
--- coredump //核心转储,进程崩溃时,将进程堆栈信息保存到core文件
系统调用分析
--- strace //显示调用的参数并返回符号形式的值
内核信息获取
伪文件系统 -用于内核空间和用户空间数据交换
--- procfs //用来获取处理器、内存、设备驱动、进程等各种信息
--- sysfs //跟kobject框架紧密联系,而kobject是为设备驱动模型存在的,所以sysfs是为了设备驱动服务的
--- debugfs
--- relayfs
内核调试
--- kgdb //调试linux内核,使用kgdb调试时需要两台机器,一台作为开发机(development machine),另一台作为目标机(target machine),两台机器之间通过串口或者以太网口相连
模块的调试 lkm的调试具有其特殊性。由于内核模块中各段的地址是在模块加载进内核的时候才最终确定的,所以develop机的gdb无法得到各种符号地址信息。(version2.4中 加载模块->查看段信息->手动载入段信息到gdb;version2.6之后 直接在模块中添加地址变量打印)
--- kdb //linux系统的内核调试器,为内核驱动程序员提供调试手段,允许高手访问内核内存空间和数据结构,可以调试正在运行的内核
--- fstrace //功能强大的调试,跟踪手段。跟踪内核指定位置上的相关信息
--- kprobe //轻量级的内核调试工具,可以将断点插入到正在运行的内核之中。同时又是一些更高级的调试工具的基础设施(比如perf和systemtap)
内核异常分析
--- bug //内核能够检测出来,不会对系统运行产生影响
--- oops //程序进入内核态时,进入一种异常状态,异常机制捕获异常,将系统关联信息打印到串口上(包含系统错误的细节,如cpu寄存器的内容等),正常情况下oops消息会被记录到系统日志中
--- panic //系统将挂起(重启),死机(crash)
总结:
- panic一般会造成系统重启;oops不一定会引起系统重启,只是杀死相关进程
* 非中断上下文的oops 只是oops
* 中断上下文oops 要panic
* 如果设置了panic_on_oops,任何oops都是panic
* oops可以看成内核级的segmentation fault
内核转储机制
--- kdump //是迄今为止最可靠的内核转存机制,依赖kernel-debuginfo包分析vmcore文件。基于kexec的内核崩溃转储机制,当系统崩溃时,kdump使用kexec启动到第二内核(通常叫捕获内核),以很小的内存启动以捕获转储镜像。第一个内核保留了内存的一部分给第二内核启动用。由于kdump利用kexec启动捕获内核,绕过了BIOS,所以第一个内核的内存得以保留