Linux内核调试方法总结之strace ,ltrace, ptrace, ftrace, sysrq

come from : https://www.cnblogs.com/justin-y-lin/tag/%E5%86%85%E6%A0%B8/

strace

【用途】

strace是一个功能强大的调试、分析、诊断工具,跟踪程序或进程执行时的系统调用和所接收的信号。可将所调用的系统调用的名称、参数和返回值输出到标准输出或者输出到-o指定的文件。

【命令格式】

strace [ -dffhiqrtttTvxx ] [ -a column ] [ -e expr ] ...

[ -o file ] [ -p pid ] ... [ -s strsize ] [ -u username ] [ command [ arg ... ] ]

strace -c [ -e expr ] ... [ -O overhead ] [ -S sortby ] [ command [ arg ... ] ]

【参数说明】

-c 统计每一系统调用的所执行的时间,次数和出错的次数等.

-d 输出strace关于标准错误的调试信息.

-f 跟踪由fork调用所产生的子进程.

-ff 如果提供-o filename,则所有进程的跟踪结果输出到相应的filename.pid中,pid是各进程的进程号.

-F 尝试跟踪vfork调用.在-f时,vfork不被跟踪.

-h 输出简要的帮助信息.

-i 输出系统调用的入口指针.

-q 禁止输出关于脱离的消息.

-r 打印出每一个系统调用的相对时间.

-t 在输出中的每一行前加上时间信息.

-tt 在输出中的每一行前加上时间信息,微秒级.

-ttt 微秒级输出,以秒了表示时间.

-T 显示每一调用所耗的时间.

-v 输出所有的系统调用.一些调用关于环境变量,状态,输入输出等调用由于使用频繁,默认不输出.

-V 输出strace的版本信息.

-x 以十六进制形式输出非标准字符串

-xx 所有字符串以十六进制形式输出.

-a column

设置返回值的输出位置.默认为40.

-e expr

指定一个表达式,用来控制如何跟踪.格式如下:

[qualifier=][!]value1[,value2]...

qualifier只能是 trace,abbrev,verbose,raw,signal,read,write其中之一.value是用来限定的符号或数字.默认的qualifier是 trace.感叹号是否定符号.例如:

-eopen等价于 -e trace=open,表示只跟踪open调用.而-etrace!=open表示跟踪除了open以外的其他调用.有两个特殊的符号 all 和 none.

注意有些shell使用!来执行历史记录里的命令,所以要使用\\\\.

-e trace=set

只跟踪指定的系统调用.例如:-e trace=open,close,rean,write表示只跟踪这四个系统调用.默认的为set=all.

-e trace=file

只跟踪有关文件操作的系统调用.

-e trace=process

只跟踪有关进程控制的系统调用.

-e trace=network

跟踪与网络有关的所有系统调用.

-e strace=signal

跟踪所有与系统信号有关的系统调用

-e trace=ipc

跟踪所有与进程通讯有关的系统调用

-e abbrev=set

设定strace输出的系统调用的结果集.-v 等与 abbrev=none.默认为abbrev=all.

-e raw=set

将指定的系统调用的参数以十六进制显示.

-e signal=set

指定跟踪的系统信号.默认为all.如signal=!SIGIO(或者signal=!io),表示不跟踪SIGIO信号.

-e read=set

输出从指定文件中读出的数据.例如:

-e read=3,5

-e write=set

输出写入到指定文件中的数据.

-o filename

将strace的输出写入文件filename

-p pid

跟踪指定的进程pid.

-s strsize

指定输出的字符串的最大长度.默认为32.文件名一直全部输出.

-u username

以username的UID和GID执行被跟踪的命令.


ltrace

【用途】

库文件调用跟踪器,Linux内核内建命令,用法类似strace

【命令格式】

                       

【参数说明】【详细说明参考man ltrace帮助文档】

-D 打印调试信息 01-DEBUG_GENERAL 010-DEBUG_EVENT 020-DEBUG_PROCESS 040-DEBUG_FUNCTION

-f 同时跟踪当前进程创建的子进程(fork或者clone)

-l 指定特定的库文件名

-o 指定输出文件名

-p 指定进程PID

-r 打印相对时间

-S 打印系统调用

-T 打印每次函数调用耗时


ptrace

【用途】

进程跟踪器,类似于gdb watch的调试方法

【原理】【详细说明参考man ptrace帮助文档】

ptrace系统调用主要是父进程用来观察和控制子进程的执行过程、检查并替换子进程执行序列或者寄存器值的一种手段。主要用于实现断点调试和跟踪系统调用。

【接口说明】

#include <sys/ptrace.h>

long ptrace(enum __ptrace_request request, pid_t pid, void *addr, void *data);

序号

宏定义

说明

1

PTRACE_TRACEME

子进程通知内核该进程被父进程trace

2

PTRACE_PEEKTEXT

偷看子进程的代码段

3

PTRACE_PEEKDATA

偷看子进程的数据段

4

PTRACE_PEEKUSER

偷看子进程的用户数据

5

PTRACE_POKETEXT

篡改子进程的代码段

6

PTRACE_POKEDATA

篡改子进程的数据段

7

PTRACE_POKEUSER

篡改子进程的用户数据

8

PTRACE_GETREGS

读取子进程的寄存器值

9

PTRACE_GETFPREGS

读取子进程的浮点型寄存器值

10

PTRACE_GETSIGINFO

查看导致子进程中止执行的信号量的信息

11

PTRACE_SETREGS

设置子进程寄存器值

12

PTRACE_SETFPREGS

设置子进程浮点型寄存器值

13

PTRACE_SETSIGINFO

设置子进程响应的信号量

14

PTRACE_SETOPTIONS

设置跟踪选项

15

PTRACE_GETEVENTMSG

获取ptrace事件信息,并保存到父进程的数据段

16

PTRACE_CONT

父进程中调用,通知子进程继续执行

17

PTRACE_SYSCALL

 

18

PTRACE_SINGLESTEP

单步调试

19

PTRACE_SYSEMU

 

20

PTRACE_SYSEMU_SINGLESTEP

多步调试

21

PTRACE_KILL

删除子进程的跟踪器

22

PTRACE_ATTACH

附加跟踪器到子进程上

23

PTRACE_DETACH

移除子进程上的跟踪器


ftrace

【用途】

ftrace包含一系列跟踪器,用于不同的场合,比如跟踪内核函数调用(function tracer)、跟踪上下文切换(sched_switch tracer)、查看中断被关闭的时长(irqsoff tracer)、跟踪内核中的延迟以及性能问题等。Ftrace是内建于Linux的内核跟踪工具,依赖于内核配置宏(Kernel Hacking->Tracers)和debugfs。

【原理】

                       

ftrace本质上是一种静态代码插装技术,不需要支持某种变成接口让用户自定义trace行为,这样可以提高系统的稳定性。其具体实现有两种机制:mcount机制,通过编译器内建的打桩工具在编译时植入桩代码,通过gcc –pg选项使能,用于实现function和function_graph两种tracer;tracepoint机制,与常见的钩子函数机制是一样的,在关键函数中添加钩子函数实现。

【使用技巧】

http://www.ibm.com/developerworks/cn/linux/l-cn-ftrace/index.html


sysrq

【用途】

Sysrq被称为”魔术组合键”, 是内建于Linux内核的调试工具。只要内核没有完全锁住,不管内核在做什么事情,使用这些组合键都可以搜集包括系统内存使用、CPU任务处理、进程运行状态等系统运行信息。

【原理】【内核帮助文档kernel/Documentation/sysrq.txt】

首先,内核配置选项中要使能CONFIG_MAGIC_SYSRQ选项,这样系统启动之后,会生成/proc/sysrq-trigger节点用于调试。

其次,可以在/etc/sysctl.conf中设置kernel.sysrq=1默认使能sysq功能。也可以通过写/proc/sys/kernel/sysrq节点动态使能sysrq功能。写入不同的值使能不同的功能:

0 - disable sysrq completely

1 - enable all functions of sysrq

2 - enable control of console   logging level

4 - enable control of keyboard (SAK,   unraw)

8 - enable debugging dumps of   processes etc.

16 - enable sync command

32 - enable remount read-only

64 - enable signalling of processes   (term, kill, oom-kill)

128- allow reboot/poweroff

256- allow nicing of all RT tasks

【使用说明】

#echo m > /proc/sysrq-trigger 导出内存分配信息

#echo t > /proc/sysrq-trigger 导出当前任务状态信息

#echo p > /proc/sysrq-trigger 导出当前CPU寄存器和标志位信息

#echo c > /proc/sysrq-trigger 产生空指针panic事件,人为导致系统崩溃

#echo s > /proc/sysrq-trigger 即时同步所有挂载的文件系统

#echo u > /proc/sysrq-trigger 即时重新挂载所有的文件系统为只读

#echo w > /proc/sysrq-trigger转储处于uninterruptable阻塞状态的任务

猜你喜欢

转载自blog.csdn.net/zmjames2000/article/details/88410484