Linux下调试与性能分析工具的总结

简介: 版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/feilengcui008/article/details/51306894 (此...
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/feilengcui008/article/details/51306894

(此文主要用来记录一些调试,性能测试与分析等工具的用法,备忘)

Linux下的追踪和性能统计

Linux内核提供的基础设施

  • tarcepoints => 静态探测点
  • kprobe => 内核态动态探测点(kernel/kprobe.c, example:sample/kprobe)
  • uprobe => 用户态动态探测点(kernel/events/uprobe.c)

其最基本的用法我们可以写内核模块注入某个探测点的探针,做一些追踪与统计分析,
但通常会有更方便的框架以及其前端工具,比如下面将提到的ftrace与trace-cmd,
perf_events与perf, systemtap, 还有基于这些前端工具的工具perf-tools…

ftrace framework

1. 介绍

ftrace框架主要以debugfs中/sys/kernel/debug/trace文件系统的形式提供了静态和动态
追踪的接口,ftrace框架有命令行和图像化的前端工具trace-cmd 和 kernelshark。而且
提供了不同种类的tracer, 可以使用下面命令查看:

cat /sys/kernel/debug/trace/available_tracers

ftrace的核心代码位于kernel/trace目录下,ftrace.c注册了debugfs下的trace目录,
trace_kprobe.c和trace_uprobe.c提供了kprobe和uprobe的接口。除了kprobe和uprobe,
ftrace还提供了events支持,主要位于/kernel/sys/debug/trace/events, 主要包括
硬件事件,内核软件事件,以及静态tracepoints的事件。可以通过下面命令查看支持的事件:

cat /sys/kernel/debug/trace/available_events

2. 例子

(例子来源于内核源码Documentation/trace)

  • 基于ftrace使用kprobe动态trace:
// 添加探针
echo 'p:myprobe do_sys_open dfd=%ax filename=%dx flags=%cx mode=+4($stack)' > /sys/kernel/debug/tracing/kprobe_events
echo 'r:myretprobe do_sys_open $retval' >> /sys/kernel/debug/tracing/kprobe_events

// 激活
echo 1 > /sys/kernel/debug/tracing/events/kprobes/myprobe/enable
echo 1 > /sys/kernel/debug/tracing/events/kprobes/myretprobe/enable

// 查看输出
cat /sys/kernel/debug/tracing/trace

// 关闭
echo 0 > /sys/kernel/debug/tracing/events/kprobes/myprobe/enable
echo 0 > /sys/kernel/debug/tracing/events/kprobes/myretprobe/enable

// 移除探针
echo -:myprobe >> kprobe_events
echo > /sys/kernel/debug/tracing/kprobe_events
  • 基于ftrace使用uprobe动态trace(kernel/trace/trace_uprobe.c)
// 添加探针
echo 'p: /bin/bash:0x4245c0' > /sys/kernel/debug/tracing/uprobe_events
echo 'r: /bin/bash:0x4245c0' > /sys/kernel/debug/tracing/uprobe_events

// 激活
echo 1 > events/uprobes/enable

// 查看输出
cat /sys/kernel/debug/tracing/trace

// 关闭
echo 0 > events/uprobes/enable

// 移除
echo '-:bash_0x4245c0' >> /sys/kernel/debug/tracing/uprobe_events
echo > /sys/kernel/debug/tracing/uprobe_events
  • 基于ftrace使用tracepoints静态events(kernel/trace/trace_events.c)
    • 通常我们可以写内核模块给某个静态tracepoint添加探针
    • 基于ftrace events
// 添加event
echo sched_wakeup >> /sys/kernel/debug/tracing/set_event
echo *:* > /sys/kernel/debug/tracing/set_event
echo 'irq:*' > /sys/kernel/debug/tracing/set_event

// 激活event
echo 1 > /sys/kernel/debug/tracing/events/sched/sched_wakeup/enable

// 查看输出
cat /sys/kernel/debug/tracing/trace

// 移除event
echo '!sched_wakeup' >> /sys/kernel/debug/tracing/set_event
echo > /sys/kernel/debug/tracing/set_event

perf_events

1. 介绍

perf_events和对应的前端工具perf提供了硬件和软件层面的计数等性能分析。其源码位于
内核源码树tools/perf目录下。

2. 例子

systemtap

1. 介绍

2. 例子

perf-tools and flamegraph

1. 介绍

2. 例子


GDB常用调试命令和调试技巧

命令

  • status
    • info => 查看程序本身相关信息
      • args => 打印参数
      • breakpoints => 断点信息
      • files => 进程的地址空间详细内容
      • sharedlibrary => 加载的共享库
      • frame => 栈帧
      • line => 当前所在行
      • locals => 当前栈帧中的变量
      • registers => 寄存器信息
      • stack => 栈信息
      • source => 当前源码文件信息
      • auxv => 进程属性
      • address/symbol => symbol的地址/地址的symbol
      • threads => 线程信息
      • tracepoints => tracepoint信息
      • vtbl => 某个类指针的虚函数表
      • watchpoints => 显示watchpoints信息
    • show => 查看系统配置环境等信息
      • environment => 环境变量
      • endian => 大小端
      • print => 打印格式的相关配置
  • breakpoints
    • awatch/watch => 为某个表达式设置watchpoint
    • break => 设置断点
    • clear => 清除断点
    • catch => 当发生下列某个时间时stop
      • assert
      • catch
      • fork
      • exec
      • signal
      • syscall
      • throw
      • vfork
    • delete => 删除
      • breakpoints
      • checkpoint
      • tracepoints
  • data

    • disassemble => 反汇编某段代码
    • dump binary
      • memory => 二进制形式dump内存
      • value => 二进制形式dump值
    • set => 修改gdb配置
  • stack

    • backtrace/bt => 所有栈帧
    • down/up => 下一帧/上一帧
    • frame => 打印某一帧

技巧

  • 设置watch points调试内存非法写等错误

valgrind常用命令和技巧

命令

  • –tool
    • memcheck =>
    • cachegrind =>
    • callgrind =>
    • helgrind =>
  • –trace-children => 多进程
  • –leak-check=no|summay|yes|full => 打印内存泄露信息

技巧

  • 生成调用图
    • 先用valgrind生成call.grind.out.xxx文件
    • 生成dot文件: gprof2dot -f callgrind -n10 -s callgrind.out.xxx > out.dot
    • 生成png: dot -Tpng out.dot -o out.png
相关文章
|
1月前
|
监控 Unix Linux
Linux系统工具
Linux系统工具
44 6
|
11天前
|
缓存 NoSQL Linux
Linux调试
本文介绍了Linux调试、性能分析和追踪的培训资料,涵盖调试、性能分析和追踪的基础知识及常用工具。
175 6
Linux调试
|
28天前
|
监控 Java Linux
Linux系统之安装Ward服务器监控工具
【10月更文挑战第17天】Linux系统之安装Ward服务器监控工具
50 5
Linux系统之安装Ward服务器监控工具
|
1月前
|
JSON JavaScript Linux
Linux系统之安装cook菜谱工具
【10月更文挑战第15天】Linux系统之安装cook菜谱工具
35 2
Linux系统之安装cook菜谱工具
|
19天前
|
缓存 监控 Linux
Linux性能分析利器:全面掌握perf工具
【10月更文挑战第18天】 在Linux系统中,性能分析是确保软件运行效率的关键步骤。`perf`工具,作为Linux内核自带的性能分析工具,为开发者提供了强大的性能监控和分析能力。本文将全面介绍`perf`工具的使用,帮助你成为性能优化的高手。
65 1
|
19天前
|
缓存 监控 Linux
掌握Linux性能分析:深入探索perf工具
【10月更文挑战第26天】
23 1
|
1月前
|
Web App开发 监控 JavaScript
一些常用的 Vue 性能分析工具
【10月更文挑战第2天】
75 1
|
2月前
|
SQL 缓存 关系型数据库
MySQL高级篇——性能分析工具
MySQL的慢查询日志,用来记录在MySQL中响应时间超过阀值的语句,具体指运行时间超过long-query_time值的SQL,则会被记录到慢查询日志中。long_query_time的默认值为 10,意思是运行10秒以上(不含10秒)的语句,认为是超出了我们的最大忍耐时间值。它的主要作用是,帮助我们发现那些执行时间特别长的 SOL 查询,并且有针对性地进行优化,从而提高系统的整体效率。当我们的数据库服务器发生阻塞、运行变慢的时候,检查一下慢查询日志,找到那些慢查询,对解决问题很有帮助。
MySQL高级篇——性能分析工具
|
2月前
|
人工智能 监控 Shell
常用的 55 个 Linux Shell 脚本(包括基础案例、文件操作、实用工具、图形化、sed、gawk)
这篇文章提供了55个常用的Linux Shell脚本实例,涵盖基础案例、文件操作、实用工具、图形化界面及sed、gawk的使用。
472 2
|
2月前
|
监控 IDE Java
【Java性能调优新工具】JDK 22性能分析器:深度剖析,优化无死角!
【9月更文挑战第9天】JDK 22中的性能分析器为Java应用的性能调优提供了强大的支持。通过深度集成、全面监控、精细化分析和灵活报告生成等核心优势,性能分析器帮助开发者实现了对应用性能的全面掌控和深度优化。在未来的Java开发过程中,我们期待性能分析器能够继续发挥重要作用,为Java应用的性能提升贡献更多力量。