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
AI 代码解读
  • 基于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
AI 代码解读
  • 基于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
AI 代码解读

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
目录
打赏
0
0
0
0
4
分享
相关文章
DBeaver Ultimate Edtion 25.0 Multilingual (macOS, Linux, Windows) - 通用数据库工具
DBeaver Ultimate Edtion 25.0 Multilingual (macOS, Linux, Windows) - 通用数据库工具
88 12
DBeaver Ultimate Edtion 25.0 Multilingual (macOS, Linux, Windows) - 通用数据库工具
Linux 超级强大的十六进制 dump 工具:XXD 命令,我教你应该如何使用!
在 Linux 系统中,xxd 命令是一个强大的十六进制 dump 工具,可以将文件或数据以十六进制和 ASCII 字符形式显示,帮助用户深入了解和分析数据。本文详细介绍了 xxd 命令的基本用法、高级功能及实际应用案例,包括查看文件内容、指定输出格式、写入文件、数据比较、数据提取、数据转换和数据加密解密等。通过掌握这些技巧,用户可以更高效地处理各种数据问题。
553 8
Android调试终极指南:ADB安装+多设备连接+ANR日志抓取全流程解析,覆盖环境变量配置/多设备调试/ANR日志分析全流程,附Win/Mac/Linux三平台解决方案
ADB(Android Debug Bridge)是安卓开发中的重要工具,用于连接电脑与安卓设备,实现文件传输、应用管理、日志抓取等功能。本文介绍了 ADB 的基本概念、安装配置及常用命令。包括:1) 基本命令如 `adb version` 和 `adb devices`;2) 权限操作如 `adb root` 和 `adb shell`;3) APK 操作如安装、卸载应用;4) 文件传输如 `adb push` 和 `adb pull`;5) 日志记录如 `adb logcat`;6) 系统信息获取如屏幕截图和录屏。通过这些功能,用户可高效调试和管理安卓设备。
Linux下如何安装配置Fail2ban防护工具
通过以上步骤,可以在Linux系统中成功安装和配置Fail2ban,从而有效保护服务器免受暴力破解等攻击。Fail2ban通过实时监控日志文件,自动更新防火墙规则,为系统安全提供了一层重要的保护。
252 36
|
3月前
|
[Linux工具] Makefile
Makefile是Linux环境下用于自动化编译和链接程序的配置文件,常用于简化大型项目的编译流程。通过定义目标文件、依赖文件及生成命令,Makefile能高效管理编译任务。它不仅适用于C语言项目,还可扩展到其他编程语言和非编程任务中。
68 20
[Linux工具] Makefile
|
2月前
|
Linux下载工具wget与curl
`wget` 是一个用于从网络下载文件的命令行工具,支持HTTP、HTTPS和FTP协议。它能自动处理下载中断,并支持递归下载网站内容。基本用法:`wget URL`,可指定文件名(`-O`)、保存目录(`-P`),还支持断点续传(`-c`)、限速(`--limit-rate`)和递归下载(`-r`)。相比之下,`curl` 更侧重于发送各种HTTP请求(如GET、POST),并支持文件上传、自定义请求头和cookie等功能。
73 10
Linux软件包管理工具概览
在Linux系统中,dpkg、apt、rpm、yum和dnf是几种常见的包管理工具,它们分别属于不同的Linux发行版或家族,并有着各自的诞生顺序和特点。下面将按照这些工具的诞生顺序,并结合Debian、Red Hat、CentOS、Ubuntu和Kali等系统,进行详细的介绍。
52 4
Linux(openwrt)下iptables+tc工具实现网络流量限速控制(QoS)
通过以上步骤,您可以在Linux(OpenWrt)系统中使用iptables和tc工具实现网络流量限速控制(QoS)。这种方法灵活且功能强大,可以帮助管理员有效管理网络带宽,确保关键业务的网络性能。希望本文能够为您提供有价值的参考。
305 28
深入解析:Linux网络配置工具ifconfig与ip命令的全面对比
虽然 `ifconfig`作为一个经典的网络配置工具,简单易用,但其功能已经不能满足现代网络配置的需求。相比之下,`ip`命令不仅功能全面,而且提供了一致且简洁的语法,适用于各种网络配置场景。因此,在实际使用中,推荐逐步过渡到 `ip`命令,以更好地适应现代网络管理需求。
92 11
结合 `nc` 工具利用笑脸漏洞(Smile Bug)攻击 Metasploitable2 Linux
本文介绍如何使用 `nc`(Netcat)工具结合笑脸漏洞(Smiley Bug)攻击 Metasploitable2 Linux 靶机。首先概述了 `nc` 的基本功能和高级用法,包括建立连接、监听端口、文件传输等操作。接着详细描述了笑脸漏洞的原理及其在网络攻防中的应用,展示了通过 `nc` 发送恶意输入检测漏洞的方法。最后结合 Python 脚本实现更复杂的攻击场景,并强调了合法性和环境隔离的重要性。
72 13
AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等