linux kernel配置调试方法

步骤

安装新内核,记住 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远程打印日志信息

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值