linux kernel配置调试方法

  • Post author:
  • Post category:linux


步骤

安装新内核,记住 grub 的序号,修改 grub.conf

将默认内核改成一个正常可用内核,而不是新安装的内核。

新内核启动时加入panic=5,使新内核启动失败后自动重启。

grub下次重启后进入新内核,使新内核仅在下次重启作为默认内核。一旦发生再次重启,就会按照进入 grub.conf 指定的默认内核。

root 权限运行 grub 命令,进入 grub 命令行。在 grub 命令行中运行(假设新内核的序号为 0),savedefault –default=0 –once,输入 quit 以离开 grub 命令行,通过 crontab 设置机器自动重启。

运行 crontab -e,进入 crontab 配置文件,加入一行*/15 * * * * reboot。

重启系统,如果能正常进入新内核,则运行 crontab -e,删除 reboot 的一行。

系统性能分析工具perf

内置于Linux内核源码树中的性能剖析工具。基于事件采样原理以性能事件为基础,支持针对处理器相关性能指标与操作系统相关性能指标的性能剖析。常用于性能瓶颈的查找与热点代码的定位。举例:

perf top

# perf top // 默认配置

# perf top -G // 得到调用关系图

# perf top -e cycles // 指定性能事件

# perf top -p 23015,32476 // 查看这两个进程的cpu cycles使用情况

# perf top -s comm,pid,symbol // 显示调用symbol的进程名和进程号

# perf top –comms nginx,top // 仅显示属于指定进程的符号

# perf top –symbols kfree // 仅显示指定的符号

perf stat

执行10次程序,给出标准偏差与期望的比值:

# perf stat -r 10 ls > /dev/null

显示更详细的信息:

# perf stat -v ls > /dev/null

只显示任务执行时间,不显示性能计数器:

# perf stat -n ls > /dev/null

单独给出每个CPU上的信息:

# perf stat -a -A ls > /dev/null

ls命令执行了多少次系统调用:

# perf stat -e syscalls:sys_enter ls

perf record

记录nginx进程的性能数据:

# perf record -p `pgrep -d ‘,’ nginx`

记录执行ls时的性能数据:

# perf record ls -g

记录执行ls时的系统调用,可以知道哪些系统调用最频繁:

# perf record -e syscalls:sys_enter ls

参考:


系统级性能分析工具 — Perf_zhangskd的专栏-CSDN博客_perf top


Linux 性能诊断 perf使用指南-阿里云开发者社区


http://kernel.taobao.org/index.php?title=Documents/Kernel_Perf

火焰图制作工具:


GitHub – brendangregg/FlameGraph: Stack trace visualizer

内核调试技巧

Kdump&Crash 调试技巧

安装Kdump和Crash

yum install kexec-tools

yum install crash

参考:

Kdump & Crash 学习笔记(一)

配置Kdump

参考:

Kdump & Crash 学习笔记(二)

参考:

Kdump & Crash 学习笔记(三)

objdump 应用

常用命令:

objdump -x obj 以某种分类信息的形式把目标文件的数据组织(被分为几大块)输出 <可查到该文件的所有动态库>

objdump -t obj 输出目标文件的符号表()

objdump -h obj 输出目标文件的所有段概括()

objdump -j .text/.data -S obj 输出指定段的信息,大概就是反汇编源代码把

objdump -S obj C语言与汇编语言同时显示

参考:

gcc命令objdump用法

SystemTap

以下介绍 SystemTap 完整环境的配置流程。完整环境即支持从 SystemTap 脚本解析到 SystemTap 运行的完整流程的环境。

安装内核开发包 kernel-devel:

查看当前内核的开发包是否已安装: rpm -q kernel-devel-`uname -r`。

若未安装:如果使用 CentOS 标准内核,则用 yum 安装:yum install kernel-devel。

如果新安装 kernel-devel 与当前运行内核版本不匹配,则还需要更新内核并重启:yum update kernel; reboot。

安装内核调试信息包 kernel-debuginfo(内核态跟踪需要)。

如果是要跟踪用户态程序,而非内核本身,则可略过此步。

查看当前运行内核的调试信息包是否已安装: rpm -q kernel-debuginfo-`uname -r`。

若未安装:

如果使用 CentOS 标准内核,则用 yum 安装:yum install /usr/bin/debuginfo-install; debuginfo-install kernel。

如果新安装 kernel-debuginfo 与当前运行内核版本不匹配,则还需要更新内核并重启:yum update kernel kernel-devel reboot。

安装内核调试源码包 kernel-debuginfo-common内核源码仅为了编写 SystemTap 脚本时作参考之用。

可直接参考 git 仓库中的代码。

查看当前运行内核的调试源码包是否已安装: rpm -q kernel-debuginfo-`uname -m`-`uname -r`

若未安装:

如果使用 CentOS 标准内核,则安装 kernel-debuginfo 时会自动通过依赖安装上对应的 kernel-debuginfo-common内核 debuginfo 包的组织。

内核的 debuginfo 包除了 kernel-debuginfo 外,还有一个 kernel-debuginfo-common-x86_64 (x86_64 为系统架构代号)

kernel-debuginfo: 提供内核及内核模块的调试信息

kernel-debuginfo-common-x86_64: 提供内核源码

使用 SystemTap 进行内核级调试时,需要安装 kernel-debuginfo。kernel-debuginfo-common-x86_64 并不需要,即使使用 kernel.statement 等代码行号级别的 probe 点。 安装 SystemTap

yum install systemtap  运行示例编写简单的 SystemTap 脚本,保存为 who-is-reading.stp 如下

probe syscall.read

{

printf(“[%d] %s\n”, pid(), execname())

}

运行 stap who-is-reading.stp。稍等会就有很多输出。然后按 Ctrl-C 结束。

SystemTap 单纯运行环境

SystemTap 支持在单独设备上先将 SystemTap 脚本编译成 ko 文件。然后在其它设备上,仅需要 staprun 命令就能完成运行,无需在设备上安装 kernel-devel 及 kernel-debuginfo。

安装方法:yum install systemtap-runtime

SystemTap 入门

SystemTap 参考资料:

Systemtap 学习

CentOS 系统上如何安装调试信息包:

  1. 安装 yum-utils。它提供 debuginfo-install 命令。
  2. 启用 Debuginfo Yum 源,修改 /etc/yum.repos.d/CentOS-Debuginfo.repo,将 enabled 改为 1
  3. 安装 debuginfo 包(将 grep 改为你需要的包名,实际上即安装 grep-debuginfo): debuginfo-install grep
  4. 至此安装完成,可以用 rpm -ql grep-debuginfo 查看实际加入了哪些文件

关于 debuginfo 包

每个带二进制程序的 RPM 包,在打包时,都会产生一个对应的 debuginfo 包,如 grep => grep-debuginfo。

二进制文件通常即为 ELF 为件,如可执行文件(/bin/grep),以及动态库(/lib64/

libc.so

)

debuginfo 包中主要包含两类内容二进制文件的调试信息,即编译过程生成的符号表。

以相同路径安装于 /usr/lib/debug/ 目录下,二进制文件文件名加上 .debug 后缀二进制文件对应的程序源码。

以 rpmbuild 的 BUILD 路径,安装于 /usr/src/debug 下。

Kdump 和 Crash 技术

参见:

Kdump和Crash的配置方法与内核故障原因分析

Netconsole 技术

参见:

Linux配置Netconsole远程打印日志信息



版权声明:本文为realmardrid原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。