2016年4月23日

Linux内核调试方法总结之死锁问题分析

摘要: 死锁问题分析 死锁就是多个进程(线程)因为等待别的进程已占有的自己所需要的资源而陷入阻塞的一种状态,死锁状态一旦形成,进程本身是解决不了的,需要外在的推动,才能解决,最重要的是死锁不仅仅影响进程业务,而且还会占用系统资源,影响其他进程。所以内核中设计了内核死锁检测机制,一旦发现死锁进程,就重启OS, 阅读全文

posted @ 2016-04-23 14:35 者旨於陽 阅读(11126) 评论(0) 推荐(0) 编辑

Linux内核调试方法总结之bugreport

摘要: bugreport 【用途】Android性能分析工具,bugreport记录了Android启动过程日志,启动后的系统状态,包括进程列表、内存信息、VM信息等 【使用方法】 Adb bugreport > bugreport.txt (导出bugreport信息) 【日志分析】 (1)dumpst 阅读全文

posted @ 2016-04-23 14:34 者旨於陽 阅读(1050) 评论(0) 推荐(0) 编辑

Linux内核调试方法总结之dumpsys

摘要: dumpsys 【用途】Android系统提供的dumpsys工具可以用来查看系统服务信息与状态。 【使用说明】 adb shell dumpsys <service> [<option>] 【常用服务解释】 编号 服务名称 功能 1 account 显示accounts信息 2 activity 阅读全文

posted @ 2016-04-23 14:33 者旨於陽 阅读(2607) 评论(0) 推荐(0) 编辑

Linux内核调试方法总结之Jprobes

摘要: Jprobes 【用途】 类似于Kprobes和Return Probes,区别在于,Kprobes可以在任意指令处插入探针,Jprobes只在函数入口插入探针,而Return Probes则是在函数返回时插入探针。 【接口说明】【参考samples/kprobes/jprobe_example.c 阅读全文

posted @ 2016-04-23 14:32 者旨於陽 阅读(2048) 评论(0) 推荐(0) 编辑

Linux内核调试方法总结之Kprobes

摘要: Kprobes 【用途】【参考kernel/Documentation/kprobes.txt帮助文档】 Kprobes是一个轻量级内核调试工具,同时又是其他一些更高级的内核调试工具(如perf和systemtap)的基础,在Linux 4.0内核版本中,eBPF特性也寄生于kprobe之上。 【原 阅读全文

posted @ 2016-04-23 14:27 者旨於陽 阅读(1244) 评论(0) 推荐(0) 编辑

Linux内核调试方法总结之内核通知链

摘要: Linux内核通知链notifier 1.内核通知链表简介(引用网络资料) 大多数内核子系统都是相互独立的,因此某个子系统可能对其它子系统产生的事件感兴趣。为了满足这个需求,也即是让某个子系统在发生某个事件时通知其它的子系统,Linux内核提供了通知链的机制。通知链表只能够在内核的子系统之间使用,而 阅读全文

posted @ 2016-04-23 14:18 者旨於陽 阅读(1910) 评论(0) 推荐(0) 编辑

Linux内核调试方法总结之sysrq

摘要: sysrq 【用途】 Sysrq被称为”魔术组合键”, 是内建于Linux内核的调试工具。只要内核没有完全锁住,不管内核在做什么事情,使用这些组合键都可以搜集包括系统内存使用、CPU任务处理、进程运行状态等系统运行信息。 【原理】【内核帮助文档kernel/Documentation/sysrq.t 阅读全文

posted @ 2016-04-23 14:16 者旨於陽 阅读(15758) 评论(0) 推荐(0) 编辑

Linux内核调试方法总结之ftrace

摘要: ftrace 【用途】 ftrace包含一系列跟踪器,用于不同的场合,比如跟踪内核函数调用(function tracer)、跟踪上下文切换(sched_switch tracer)、查看中断被关闭的时长(irqsoff tracer)、跟踪内核中的延迟以及性能问题等。Ftrace是内建于Linux 阅读全文

posted @ 2016-04-23 14:12 者旨於陽 阅读(1859) 评论(0) 推荐(0) 编辑

Linux内核调试方法总结之ptrace

摘要: ptrace 【用途】 进程跟踪器,类似于gdb watch的调试方法 【原理】【详细说明参考man ptrace帮助文档】 ptrace系统调用主要是父进程用来观察和控制子进程的执行过程、检查并替换子进程执行序列或者寄存器值的一种手段。主要用于实现断点调试和跟踪系统调用。 【接口说明】 #incl 阅读全文

posted @ 2016-04-23 14:09 者旨於陽 阅读(2601) 评论(0) 推荐(0) 编辑

Linux内核调试方法总结之ltrace

摘要: ltrace 【用途】 库文件调用跟踪器,Linux内核内建命令,用法类似strace 【命令格式】 【参数说明】【详细说明参考man ltrace帮助文档】 -D 打印调试信息 01-DEBUG_GENERAL 010-DEBUG_EVENT 020-DEBUG_PROCESS 040-DEBUG 阅读全文

posted @ 2016-04-23 14:06 者旨於陽 阅读(772) 评论(0) 推荐(0) 编辑

Linux内核调试方法总结之strace

摘要: strace 【用途】 strace是一个功能强大的调试、分析、诊断工具,跟踪程序或进程执行时的系统调用和所接收的信号。可将所调用的系统调用的名称、参数和返回值输出到标准输出或者输出到-o指定的文件。 【命令格式】 strace [ -dffhiqrtttTvxx ] [ -a column ] [ 阅读全文

posted @ 2016-04-23 14:05 者旨於陽 阅读(1378) 评论(0) 推荐(0) 编辑

Linux内核调试方法总结之backtrace

摘要: backtrace 【用途】用户态或者内核态程序异常退出时回溯堆栈信息 【原理】通过对当前堆栈的分析,回溯上层函数在当前栈中的帧地址,直至顶层函数。帧地址是指在栈中存在局部变量、上一级函数返回地址、寄存器值的内存空间。由于不同处理器堆栈实现不同(向上增长和向下增长),此功能的具体实现是编译器内建的_ 阅读全文

posted @ 2016-04-23 14:04 者旨於陽 阅读(4076) 评论(0) 推荐(1) 编辑

Linux内核调试方法总结之ddebug

摘要: 【用途】 Linux内核动态调试特性,适用于驱动和内核各子系统调试。动态调试的主要功能就是允许你动态的打开或者关闭内核代码中的各种提示信息。适用于驱动和内核线程功能调试。 【使用方法】 依赖于CONFIG_DYNAMIC_DEBUG内核配置选项,一旦设置好,那么所有pr_debug()/dev_de 阅读全文

posted @ 2016-04-23 13:53 者旨於陽 阅读(2493) 评论(0) 推荐(0) 编辑

Linux内核调试方法总结之调试宏

摘要: 本文介绍的内核调试宏属于静态调试方法,通过调试宏主动触发oops从而打印出函数调用栈信息。 1) BUG_ON 查看bug处堆栈内容,主动制造oops Linux中BUG_ON,WARN_ON用于调试,比如 #define BUG_ON(condition) do { / if (unlikely( 阅读全文

posted @ 2016-04-23 13:50 者旨於陽 阅读(2133) 评论(0) 推荐(0) 编辑

Linux内核调试方法总结之Call Trace

摘要: 内核态call trace 内核态有三种出错情况,分别是bug, oops和panic。 bug属于轻微错误,比如在spin_lock期间调用了sleep,导致潜在的死锁问题,等等。 oops代表某一用户进程出现错误,需要杀死用户进程。这时如果用户进程占用了某些信号锁,这些信号锁将永远不会得到释放, 阅读全文

posted @ 2016-04-23 13:46 者旨於陽 阅读(7206) 评论(0) 推荐(0) 编辑

Linux内核调试方法总结之栈帧

摘要: 栈帧 栈帧和指针可以说是C语言的精髓。栈帧是一种特殊的数据结构,在C语言函数调用时,栈帧用来保存当前函数的父一级函数的栈底指针,当前函数的局部变量以及被调用函数返回后下一条汇编指令的地址。如下图所示: 栈帧位于栈内存中,接下里我们用一个实例展示一下栈帧的入栈和退栈过程。 stackframe.c # 阅读全文

posted @ 2016-04-23 13:31 者旨於陽 阅读(2554) 评论(0) 推荐(0) 编辑

Linux内核调试方法总结之序言

摘要: 本系列主要介绍Linux内核死机、异常重启类稳定性问题的调试方法。 在Linux系统中,一切皆为文件,而系统运行的载体,是一类特殊的文件,即进程。因此,我尝试从进程的角度分析Linux内核的死机、异常重启等问题。在内核空间,内核本身是一个特权级的进程,它包含一系列系统级线程,维护整个系统内核的运转。 阅读全文

posted @ 2016-04-23 13:16 者旨於陽 阅读(1021) 评论(0) 推荐(0) 编辑

导航