strace是什么?
按照 strace 官网的描述, strace 是一个可用于诊断、调试和教学的 Linux 用户空间跟踪器。我们用它来监控用户空间进程和内核的交互,比如系统调用、信号传递、进程状态变更等。

strace 底层使用内核的 ptrace 特性来实现其功能。
strace能做什么?

strace 常用来跟踪进程执行时的系统调用和所接收的信号。

在 Linux 世界,进程不能直接访问硬件设备,当进程需要访问硬件设备(比如读取磁盘文件,接收网络数据等等)时,必须由用户态模式切换至内核态模式,通过系统调用访问硬件设备。strace 可以跟踪到一个进程产生的系统调用,包括参数,返回值,执行消耗的时间。

在运维的日常工作中,故障处理和问题诊断是个主要的内容,也是必备的技能。strace 作为一种动态跟踪工具,能够帮助运维高效地定位进程和服务故障。它像是一个侦探,通过系统调用的蛛丝马迹,告诉你异常的真相。

输出参数的含义

每一行都是一条系统调用,等号左边是系统调用的函数名及其参数,右边是该调用的返回值。strace 显示这些调用的参数并返回符号形式的值。strace 从内核接收信息,而且不需要以任何特殊的方式来构建内核。

strace cat /dev/null
execve("/usr/bin/cat", ["cat", "/dev/null"], 0x7ffe33612c58 /* 28 vars */) = 0
brk(NULL)                               = 0x716000
mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f3cd8f60000
access("/etc/ld.so.preload", R_OK)      = -1 ENOENT (No such file or directory)
open("/etc/ld.so.cache", O_RDONLY|O_CLOEXEC) = 3
fstat(3, {st_mode=S_IFREG|0644, st_size=33439, ...}) = 0
mmap(NULL, 33439, PROT_READ, MAP_PRIVATE, 3, 0) = 0x7f3cd8f57000
close(3)                                = 0
open("/lib64/libc.so.6", O_RDONLY|O_CLOEXEC) = 3
read(3, "\177ELF\2\1\1\3\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0`&\2\0\0\0\0\0"..., 832) = 832
fstat(3, {st_mode=S_IFREG|0755, st_size=2156592, ...}) = 0
mmap(NULL, 3985920, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x7f3cd8972000
mprotect(0x7f3cd8b36000, 2093056, PROT_NONE) = 0
mmap(0x7f3cd8d35000, 24576, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x1c3000) = 0x7f3cd8d35000
mmap(0x7f3cd8d3b000, 16896, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0x7f3cd8d3b000
close(3)                                = 0
mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f3cd8f56000
mmap(NULL, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f3cd8f54000
arch_prctl(ARCH_SET_FS, 0x7f3cd8f54740) = 0
access("/etc/sysconfig/strcasecmp-nonascii", F_OK) = -1 ENOENT (No such file or directory)
access("/etc/sysconfig/strcasecmp-nonascii", F_OK) = -1 ENOENT (No such file or directory)
mprotect(0x7f3cd8d35000, 16384, PROT_READ) = 0
mprotect(0x60b000, 4096, PROT_READ)     = 0
mprotect(0x7f3cd8f61000, 4096, PROT_READ) = 0
munmap(0x7f3cd8f57000, 33439)           = 0
brk(NULL)                               = 0x716000
brk(0x737000)                           = 0x737000
brk(NULL)                               = 0x737000
open("/usr/lib/locale/locale-archive", O_RDONLY|O_CLOEXEC) = 3
fstat(3, {st_mode=S_IFREG|0644, st_size=106176928, ...}) = 0
mmap(NULL, 106176928, PROT_READ, MAP_PRIVATE, 3, 0) = 0x7f3cd242f000
close(3)                                = 0
fstat(1, {st_mode=S_IFCHR|0620, st_rdev=makedev(136, 2), ...}) = 0
open("/dev/null", O_RDONLY)             = 3
fstat(3, {st_mode=S_IFCHR|0666, st_rdev=makedev(1, 3), ...}) = 0
fadvise64(3, 0, 0, POSIX_FADV_SEQUENTIAL) = 0
read(3, "", 65536)                      = 0
close(3)                                = 0
close(1)                                = 0
close(2)                                = 0
exit_group(0)                           = ?
+++ exited with 0 +++

参数

-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执行被跟踪的命令

安装

yum list|grep strace
strace.x86_64 4.24-6.el7 base

yum -y install strace.x86_64
主要用法有两种:

1.从命令行调试一个新开始的程序
strace /etc/init.d/mysqld start

2.绑定到一个已有的PID上来调试一个正在运行的程序
strace -c -p 12541

3.strace -T -tt -s 100 -o /tmp/strace.log CMD

常用命令举例:

strace -o ~/mysqld.strace -T -tt -e trace=all -p
strace -p
strace -cp

实用例子:
一、mysqld启动时读了的哪个配置文件?

我们学习 MySQL 时,从官方文档(https://dev.mysql.com/doc/refman/5.7/en/option-files.html)知道,MySQL5.7 如果不指定读取的配置文件,他是会按次序搜寻和读取加载 my.cnf 的,如下:

sequenceFile NamePurpose
1/etc/my.cnfGlobal options
2/etc/mysql/my.cnfGlobal options
3SYSCONFDIR
/my.cnf
Global options
4$MYSQL_HOME
/my.cnf
Server-specific options (server only)
5defaults-extra-fileThe file specified with --defaults-extra-file, if any
6~/.my.cnfUser-specific options
7~/.mylogin.cnfUser-specific login path options (clients only)

上面这个表格包含了 server(mysqld)、client(mysqladmin、mysqldump、mysql、mysqlbinlog 等等)的 my.cnf 搜寻顺序,还包含了编译版安装,特殊参数下的路径搜寻顺序,更准确的 mysqld 搜寻路径见下面这个:

mysqld --verbose --help |less

在第一页找到以下这两行

Default options are read from the following files in the given order:
/etc/my.cnf /etc/mysql/my.cnf /usr/local/mysql/etc/my.cnf ~/.my.cnf

能看出 mysqld 对 my.cnf 文件的搜寻和载入顺序如下:

序号文件路径
1/etc/my.cnf
2/etc/mysql/my.cnf
3/usr/local/mysql/etc/my.cnf
4~/.my.cnf

下面我们用 strace 来调试一下看是不是,见标蓝色部分,完全一致。

[root@host-1x2-1x-1x-179 bin]# pwd
/usr/local/mysql/bin
[root@host-1x2-1x-1x-179 bin]#
[root@host-1x2-1x-1x-179 bin]# ./mysqld --version
/opt/mysql-8.0.28-linux-glibc2.12-x86_64/bin/mysqld Ver 8.0.28 for Linux on x86_64 (MySQL Community Server - GPL)
[root@host-1x2-1x-1x-179 bin]#
[root@host-1x2-1x-1x-179 bin]# strace ./mysqld 2>&1|grep my.cnf
stat(“/etc/my.cnf”, {st_mode=S_IFREG|0644, st_size=5539, …}) = 0
open(“/etc/my.cnf”, O_RDONLY) = 3
stat(“/etc/mysql/my.cnf”, 0x7ffe1c295180) = -1 ENOENT (No such file or directory)
stat(“/usr/local/mysql/etc/my.cnf”, 0x7ffe1c295180) = -1 ENOENT (No such file or directory)
stat(“/root/.my.cnf”, 0x7ffe1c295180) = -1 ENOENT (No such file or directory)
二、利⽤strace观察client端SQL执⾏

select thd_id, conn_id,user, pid, program_name,command,current_statement from sys.processlist where conn_id>0 and pid>0;

strace -T -tt -s 100 -o /tmp/strace.log -p $PID

10:51:49.814118 gettimeofday({1524192709, 814130}, NULL) = 0 <0.000009>
10:51:49.814266 write(4, "<158>2018-04-20 10:51:49 worker001 info[9185]: topic=log.xxx.xxxx_sync EAGAIN (Resource temporarily unavailable) <0.099912>
10:51:49.914265 write(4, “\n”, 1) = -1 EAGAIN (Resource temporarily unavailable) <0.100881>
10:51:50.015595 sendto(38, “|\0\0\0\3/master/SELECT * FROM idx_update_time WHERE 1 and order_no = ‘20180420104827060300005’ and kdt_id = ‘110’”, 128, MSG_DONTWAIT, NULL, 0) = 128 <0.000023>
10:51:50.015655 poll([{fd=38, events=POLLIN|POLLERR|POLLHUP}], 1, 12000) = 1 ([{fd=38, revents=POLLIN}]) <0.000526>
10:51:50.016213 recvfrom(38, “\1\0\0\1\7I\0\0\2\3def\5db”, 24, MSG_DONTWAIT, NULL, NULL) = 24 <0.000007> 10:51:50.016243 poll([{fd=38, events=POLLIN|POLLERR|POLLHUP}], 1, 12000) = 1 ([{fd=38, revents=POLLIN}]) <0.000006>
10:51:50.016262 recvfrom(38, “idx_update_time\25idx_update_time\2id\2id\f? \0\n\0\0\0\3\3B\0\0\0Q\0\0\3\3def\5xxx\25idx_update_time\25idx_update_time\6kdt_id\6kdt_id\f? \0\v\0\0\0\3)@\0\0\0U\0\0\4\3def\5xxx\25idx_update_time\25order_idx_upd”, 193, MSG_DONTWAIT, NULL, NULL) = 193 <0.000005> 10:51:50.016282 poll([{fd=38, events=POLLIN|POLLERR|POLLHUP}], 1, 12000) = 1 ([{fd=38, revents=POLLIN}]) <0.000005>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/pingmian/93423.shtml
繁体地址,请注明出处:http://hk.pswp.cn/pingmian/93423.shtml
英文地址,请注明出处:http://en.pswp.cn/pingmian/93423.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【运维进阶】实施任务控制

实施任务控制 在 Ansible 中&#xff0c;“实施任务控制” 通常指的是对任务执行流程的控制&#xff0c;比如&#xff1a; 条件执行&#xff08;when&#xff09; 循环执行&#xff08;with_items / loop&#xff09; 错误处理&#xff08;block / rescue / ignore_errors&…

Java 中的线程中断详解

Java 中的线程中断1、什么是线程中断2、如何触发线程中断3、如何处理线程中断3.1 线程中断相关的核心方法3.2 处理中断的典型方式3.3 注意事项4、线程中断与线程终止的区别5、线程中断的应用场景5.1 长时间运行任务的取消5.2 阻塞操作的快速响应5.3 服务或线程池的优雅关闭5.4 …

【LeetCode题解】LeetCode 33. 搜索旋转排序数组

【题目链接】 33. 搜索旋转排序数组 【题目描述】 【题解】 对于一个有序数组&#xff0c;我们可以使用二分查找算法来查找某个元素&#xff0c;具体的算法模板可以参考【算法基础课-算法模板1】基础算法中二分查找一节的内容。 然而&#xff0c;在这道题目中&#xff0c;数组…

使用 Serverless 架构快速构建基于 Iceberg 的事务型实时数据湖

文章目录1. 背景介绍2. 架构设计3. 方案实现3.1 CDC3.1.1 自定义插件3.1.2 配置 MSK Connect3.2 实时摄入3.2.1 Glue 实现方案3.2.1.1 在 Glue 中创建 Kafka connection3.2.1.2 Glue Streaming 任务3.2.2 EMS Serverless 实现方案3.3 使用 Athena 查询 Iceberg 表3.3.1 查询3.3…

Java零基础笔记20(Java高级技术:单元测试、反射、注解、动态代理)

1.单元测试2.反射2.1 反射第一步&#xff1a;加载类&#xff0c;获取类的字节码&#xff0c;class对象2.2 获取类中的成分&#xff08;构造器、成员变量、成员方法&#xff09;&#xff0c;并对其进行操作获取构造器的作用&#xff1a;获取成员变量的作用&#xff1a;获取成员…

WinDbg 调试

安装 Windows 调试器 WinDbg 是一种调试器,可用于分析故障转储、调试实时用户模式和内核模式代码,以及检查 CPU 寄存器和内存。 此最新版本具有更新的界面、完全现成的脚本功能、可扩展的调试数据模型、内置的时间旅行调试(TTD)支持和许多其他功能,具有更现代的用户体验。…

topographic terrain

在中文语境中&#xff0c;topographic&#xff08;地形学&#xff09;和 terrain&#xff08;地形&#xff09;这两个词都与地表特征相关&#xff0c;但它们的含义和使用场景有细微差别。以下是它们的区别&#xff1a; 1. 定义Topographic&#xff08;地形学的&#xff09;&…

SpringCloud 06 服务容错 Sentinel

雪崩&#xff1a;一个微小的故障引起系统其他部分出现故障&#xff0c;最终使整个系统不可用。 雪崩一般经历以下三个阶段&#xff1a; 实例能力出现过载。可能是 bug 导致性能下降&#xff0c;可能是实例宕机&#xff0c;可能是突发流量&#xff0c;总之实例无法处理如此多请求…

Qt同步处理业务并禁用按钮

1.界面代码 //按钮1 void Dialog::on_pushButton1_clicked() {qDebug("pushButton1 clicked start");enableBtns(false);//禁用按钮qDebug("pushButton1 do sth start");QThread::sleep(5);//休眠&#xff0c;作为同步处理业务qDebug("pushButton1 do…

虚拟专用网技术

一、需求背景物理联通&#xff1a;实现不同物理位置网络的连接基础。网络联通&#xff1a;在物理连接基础上&#xff0c;实现数据等信息的传输互通。二、虚拟专用网简介定义虚拟私有网络是依靠互联网服务提供商&#xff08;ISP&#xff09;或其他网络服务提供商&#xff08;NSP…

GANs生成对抗网络生成手写数字的Pytorch实现

目录 一、第三方库导入 二、数据集准备 三、使用转置卷积的生成器 四、使用卷积的判别器 五、生成器生成图像 六、主程序 七、运行结果 7.1 生成器和判别器的损失函数图像 7.2 训练过程中生成器生成的图像 八、完整的pytorch代码 由于之前写gans的代码时&#xff0c;…

ubuntu 通过NAT模式上网

这里必须使用VMnet8 设置为NAT模式 下面设置Ip地址区域ubuntu ip地址设置来自于上面

盲盒抽谷机小程序系统开发:从0到1的完整方法论

开发一款成功的盲盒抽谷机小程序系统&#xff0c;需兼顾技术实现、用户体验与商业逻辑。本文将从需求分析、UI/UX设计、技术架构、测试上线到运营增长&#xff0c;系统梳理从0到1的完整方法论。需求分析&#xff1a;明确“为谁而做”盲盒抽谷机的核心用户是18-35岁的二次元爱好…

web开发,在线%射击比赛管理%系统开发demo,基于html,css,jquery,python,django,三层mysql数据库

经验心得 两业务单&#xff0c;业务crud开发很简单了&#xff0c;自行学习&#xff0c;我说一下学习流程。什么是前端&#xff0c;用到那些技术html,css,javascript分别是什么&#xff1f;进阶jquery,bootstrap,各种常见前端组件又是什么&#xff0c;前端框架react,angular以及…

Centos9傻瓜式linux部署CRMEB 开源商城系统(PHP)

服务器环境推荐要求* Nignx&#xff08;必须&#xff09; * PHP 7.1 ~ 7.4&#xff08;必须此版本内&#xff0c;版本过大会警告不兼容&#xff09; * MySQL 5.7 &#xff5e; 8.0&#xff08;必须&#xff09; * Redis&#xff08;非必须&#xff09;后台页面展示&#xff1a;…

AI 云电竞游戏盒子:从“盒子”到“云-端-芯”一体化竞技平台的架构实践

摘要 AI 云电竞游戏盒子&#xff08;以下简称“电竞盒”&#xff09;不再是一台简单的客厅游戏主机&#xff0c;而是一套以 AI 调度为核心、以云原生架构为骨架、以边缘渲染为肌肉、以端侧感知为神经的“云-端-芯”协同竞技系统。本文基于 2024 年 Q2 落地的量产方案&#xff0…

基于kuboard实现kubernetes的集群管理

1、前提条件安装docker-compose2、步骤在本地目录创建kuboard-v4\在该目录下创建文件docker-compose.yaml&#xff0c;内容如下&#xff1a;configs:create_db_sql:content: |CREATE DATABASE kuboard DEFAULT CHARACTER SET utf8mb4 DEFAULT COLLATE utf8mb4_unicode_ci;cre…

Linux操作系统软件编程——多线程

什么是线程线程的定义是轻量级的进程&#xff0c;可以实现多任务的并发。线程是操作系统任务调度的最小单位线程的创建由某个进程创建&#xff0c;且进程创建线程时&#xff0c;会为其分配独立的栈区空间&#xff08;默认8M&#xff09;。线程和所在的进程&#xff0c;以及进程…

linux下找到指定目录下最新日期log文件

以下是一个完整的C函数&#xff0c;用于在指定目录下自动查找最近更新的日志文件&#xff08;根据文件名中的时间戳选择最新的文件&#xff09;&#xff1a;#include <stdio.h> #include <stdlib.h> #include <string.h> #include <dirent.h> #include…

《数学模型》经典案例——钢管的订购与运输

一、问题描述 要铺设一条 A1→A2→⋯→A15A_1 \rightarrow A_2 \rightarrow \cdots \rightarrow A_{15}A1​→A2​→⋯→A15​ 的输送天然气的主管道&#xff0c;如图 6.22 所示。经筛选后可以生产这种主管道钢管的钢厂有 S1,S2,⋯,S7S_1, S_2, \cdots, S_7S1​,S2​,⋯,S7​ 。…