Linux strace

目录

  • 1. Linux strace
  • 2. Linux 之 strace 使用技巧
    • 2.1. 追踪 linux 系统调用
    • 2.2. 只追踪特定的系统调用
      • 2.2.1. 过滤指定系统调用
      • 2.2.2. 针对进行管理的追踪
      • 2.2.3. 针对文件系统调用的追踪
      • 2.2.4. 针对内存的追踪
      • 2.2.5. 针对网络的追踪
      • 2.2.6. 针对信号的追踪
    • 2.3. 根据进程 PID 进行追踪
    • 2.4. 得到进程的汇总信息
    • 2.5. 打印指令指针
    • 2.6. 显示调用时间
    • 2.7. 显示系统调用的耗时
    • 2.8. 将追踪结果写入到文件
    • 2.9. 显示 strace 的 debug 信息
  • 3. Linux 之 strace/ltrace 使用
    • 3.1. strace
    • 3.2. ltrace
  • 4. Linux 之 strace 调试用法

1. Linux strace

2. Linux 之 strace 使用技巧

# apt install strace

2.1. 追踪 linux 系统调用

只要在原本命令的前面, 加上 strace 关键字, 我们就可以看到原本要执行的这个命令到底做了什么, 下面就是一个追踪 df 命令的例子:

$ strace df -h

结果非常容易理解, 可以看到, 每一行都是一个系统调用, 比如:

open("/etc/ld.so.cache", O_RDONLY|O_CLOEXEC) = 3

其中:

  • open: 系统调用名
  • (“/etc/ld.so.cache”, O_RDONLY|O_CLOEXEC) : 系统调用的参数
  • 3: 系统调用的返回结果

2.2. 只追踪特定的系统调用

上述 df -h 的 strace 结果是非常多的, 从中比较难以找到我们真正关心的调用, 通过 -e trace 参数, 通过传入不同的参数值, 就可以过滤出想要的结果了。

2.2.1. 过滤指定系统调用

通过传入系统调用的名称, 就可以只查看对应的系统调用了。

strace -e trace=write df -h 

除此以外, 你还可以传入:

  • strace -e trace=open,close df -h
  • strace -e trace=open,close,read,write df -h
  • strace -e trace=all df -h

2.2.2. 针对进行管理的追踪

strace -q -e trace=process df -h

2.2.3. 针对文件系统调用的追踪

strace -q -e trace=file df -h

2.2.4. 针对内存的追踪

strace -q -e trace=memory df -h

2.2.5. 针对网络的追踪

strace -e trace=network df -h

2.2.6. 针对信号的追踪

strace -e trace=signal df -h

2.3. 根据进程 PID 进行追踪

如果一个进程已经在运行, 你可以通过它的 pid 进行追踪, 它会显示追踪后这个进程的系统调用。

strace -p 3569

2.4. 得到进程的汇总信息

使用-c 参数, 可以得到追踪的每一种系统调用的耗时、次数和失败数。

strace -c -p 3569

2.5. 打印指令指针

-i 可以显示每一次系统调用的时候的指令指针

strace -i df -h

2.6. 显示调用时间

-t 参数可以显示调用时间。

strace -t df -h

2.7. 显示系统调用的耗时

-T 参数可以显示系统调用的耗时时间。

strace -T df -h

2.8. 将追踪结果写入到文件

-o 参数将标准输出写入到文件

strace -o df_debug.txt df -h

2.9. 显示 strace 的 debug 信息

-d 可以显示 strace 的 debug 信息。

strace -d df -h

3. Linux 之 strace/ltrace 使用

3.1. strace

strace ./test

ps aux | grep test
1045

strace -s 500 -p 1045

示例: 打印执行 ls 时跟文件有关的系统调用。

strace -e trace=file ls

-e trace=process

跟踪涉及过程管理的所有系统调用。这对于观察进程的派生, 等待和执行步骤很有用。

-e trace=network

跟踪所有与网络相关的系统调用。

-e trace=signal

跟踪所有与信号相关的系统调用。

-e trace=ipc

跟踪所有与 IPC 相关的系统调用。

-o 文件名

将跟踪输出写入文件名而不是 stderr。

-p pid

使用进程 ID pid 附加到该进程并开始跟踪。跟踪可以随时通过键盘中断信号 (CTRL -C) 终止。

-S

按指定条件对-c 选项打印的直方图输出进行排序。

示例: 打印执行 uname 系统调用中 calls 的次数排序

strace -fc -S calls uname

3.2. ltrace

1.ltrace 查看调用耗时
ltrace -c ./a.out
n = 0
% time seconds usecs/call calls function


100.00 0.000157 157 1 printf


100.00 0.000157 1 total

2.strace 查看调用耗时
strace -c ./a.out
n = 0
% time seconds usecs/call calls errors syscall


21.20 0.000085 17 5 mmap
18.70 0.000075 19 4 mprotect
13.47 0.000054 18 3 close
8.73 0.000035 9 4 fstat
8.48 0.000034 11 3 openat
8.23 0.000033 33 1 munmap
6.23 0.000025 8 3 brk
5.24 0.000021 21 1 write
3.74 0.000015 5 3 access
3.24 0.000013 13 1 read
2.74 0.000011 11 1 arch_prctl
0.00 0.000000 0 1 execve


100.00 0.000401 30 total

  1. 跟踪进程
    ltrace -p 11206

4. Linux 之 strace 调试用法

1. 查看函数系统调用
例子: test.c
#include <stdio.h>int main(){printf("Test strace!!!\n");}# gcc test.c -o test
# strace ./test
//打印
execve("./test.c", ["./test.c"], 0x7ffffc5f4820 /* 19 vars */) = -1 EACCES (Permission denied)
fstat(2, {st_mode=S_IFCHR|0660, st_rdev=makedev(4, 3), ...}) = 0
ioctl(2, TCGETS, {B38400 opost isig icanon echo ...}) = 0
write(2, "strace: exec: Permission denied\n", 32strace: exec: Permission denied
) = 32
getpid()                                = 23900
exit_group(1)                           = ?
+++ exited with 1 +++2. 查看某个进程系统做了什么
# strace -p 209203. 查看为什么连接不到服务器
# strace -e poll,select,connect,recvfrom,sendto nc www.bing.com 80  

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

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

相关文章

docker 修改tag

docker tag localhost:8000/yddocker/web:1.0 localhost:8000/yddocker/web:2.0 docker tag localhost:8000/yddocker/web:1.0 localhost:9000/yddocker/web:1.0

头歌 MySQL数据库 - 初识MySQL

本章内容是为了完成老师布置的作业&#xff0c;同时也是为了以后考试的时候方便复习。 数据库部分一条一条的写&#xff0c;可鼠标手动粘贴&#xff0c;除特定命令外未分大小写。 第1关&#xff1a;创建数据库 在操作数据库之前&#xff0c;需要连接它&#xff0c;输入命令&a…

怎么让NetCore接口支持Json参数

项目&#xff1a;NetCore Web API 接口支持Json参数需要安装Newtonsoft.Json.Linq和Microsoft.AspNetCore.Mvc.NewtonsoftJson Program代码 //支持json需要安装Microsoft.AspNetCore.Mvc.NewtonsoftJson using Newtonsoft.Json.Serialization;var builder WebApplication.Cr…

【C/PTA】函数专项练习(一)

本文结合PTA专项练习带领读者掌握函数&#xff0c;刷题为主注释为辅&#xff0c;在代码中理解思路&#xff0c;其它不做过多叙述。 目录 6-1 输出星期名6-2 三整数最大值6-3 数据排序6-4 多项式求值 6-1 输出星期名 请编写函数&#xff0c;根据星期数输出对应的星期名。 函数原…

【LeetCode刷题】--12.整数转罗马数字

12.整数转罗马数字 方法&#xff1a;模拟 分析罗马数字的规则是&#xff1a;对于罗马数字从左到右的每一位&#xff0c;选择尽可能大的符号值 根据罗马数字的唯一表示法&#xff0c;为了表示一个给定的整数num&#xff0c;寻找不超过num的最大符号值&#xff0c;将num减去该符…

CyNix

CyNix 一、主机发现和端口扫描 主机发现&#xff0c;靶机地址192.168.80.146 arp-scan -l端口扫描&#xff0c;只开放了80和6688端口 nmap -A -p- -sV 192.168.80.146二、信息收集 访问80端口 路径扫描 gobuster dir -u http://192.168.80.146/ -w /usr/share/wordlists/dir…

C++之内建函数对象

C之内建函数对象 算术仿函数 #include<iostream> using namespace std; #include<functional>//内建函数对象头文件 //内建函数对象 算术仿函数void test() {// negate 一元仿函数 取反仿函数negate<int>n;cout << n(100) << endl;//plus 二元仿…

软件测试/人工智能丨互联网大厂内的人工智能测试

互联网公司在人工智能&#xff08;AI&#xff09;测试方面一直处于不断发展和演变的状态。互联网公司人工智能测试目前趋势&#xff1a; 自动化测试的重要性增加&#xff1a; 随着人工智能应用的不断增多&#xff0c;互联网公司越来越意识到自动化测试的重要性。自动化测试框架…

可用于短期风速预测及光伏预测的LSTM/ELM预测程序

微❤关注“电气仔推送”获得资料&#xff08;专享优惠&#xff09; 程序内容&#xff1a; 该程序是预测类的基础性代码&#xff0c;程序对河北某地区的气象数据进行详细统计&#xff0c;程序最终得到pm2.5的预测结果&#xff0c;通过更改数据很容易得到风速预测结果。程序主要…

高精度人像背景分割SDK技术解决方案

图像处理技术已经成为企业和个人生活中不可或缺的一部分&#xff0c;特别是在人像处理方面&#xff0c;如何准确、高效地将人物与背景分离&#xff0c;一直是一个技术难题。然而&#xff0c;美摄科技凭借其在AI深度学习领域的深厚积累&#xff0c;推出了一款高精度的人像背景分…

报错:HikariPool-1 - Exception during pool initialization.

问题发现&#xff1a; 原本可以运行的springboot2项目突然无法运行且报错&#xff0c;HikariPool-1 - Exception during pool initialization。 问题分析&#xff1a; 观察报错信息发现是JDBC连接失败&#xff0c;进而搜索HikariPool-1&#xff0c;搜索得知应该是applicatio…

01-论文阅读-Deep learning for anomaly detection in log data: a survey

01-论文阅读-Deep learning for anomaly detection in log data: a survey 文章目录 01-论文阅读-Deep learning for anomaly detection in log data: a survey摘要I 介绍II 背景A 初步定义B 挑战 III 调查方法A 搜索策略B 审查的功能 IV 调查结果A 文献计量学B 深度学习技术C …

postgresql 行转列的例子

postgresql 行转列的例子 首先要启用tablefunc 扩展。 用管理员账户执行下面的指令。 CREATE EXTENSION tablefunc;在 PostgreSQL 中&#xff0c;你可以使用 crosstab 函数将列转换为行。crosstab 函数是在 tablefunc 扩展中提供的&#xff0c;因此在使用之前&#xff0c;你需…

C++中的mutable关键字

mutable是C中的一个关键字&#xff0c;它用来修饰类的成员变量。 当我们将一个成员变量声明为mutable时&#xff0c;就意味着这个成员变量可以被类的任何方法修改&#xff0c;即使这个方法是const类型的。这是因为mutable关键字可以打破const类型的限制&#xff0c;使得const类…

课时6作业2

Description 输入一个整型数&#xff0c;然后申请对应大小空间内存&#xff0c;然后读取一个字符串&#xff08;测试用例的字符串中含有空格&#xff09;&#xff0c;字符串的输入长度小于最初输入的整型数大小&#xff0c;最后输出输入的字符串即可&#xff08;无需考虑输入的…

Springboot+vue的社区医院管理系统(有报告),Javaee项目,springboot vue前后端分离项目

演示视频&#xff1a; Springbootvue的社区医院管理系统(有报告)&#xff0c;Javaee项目&#xff0c;springboot vue前后端分离项目 项目介绍&#xff1a; 本文设计了一个基于Springbootvue的前后端分离的应急物资管理系统&#xff0c;采用M&#xff08;model&#xff09;V&am…

el-form动态表单动态验证(先验证不为空,再验证长度在20以内,最后向后台发送请求验证账号是否重复)

data(){var checkSno (rule, value, callback) > {if (!value) {callback(new Error("请输入账号"));} else if (value.length > 20) {callback(new Error("长度为1-20"));} else {if (this.form.id) {// 修改时检查账号是否重复selectLoginId({ sn…

美国国家安全实验室员工详细数据在网上泄露

一个从事出于政治动机的攻击的网络犯罪组织破坏了爱达荷国家实验室&#xff08;INL&#xff09;的人力资源应用程序&#xff0c;该组织周日在电报上发帖称&#xff0c;已获得该核研究实验室员工的详细信息。 黑客组织 SiegedSec 表示&#xff0c;它已经访问了“数十万用户、员…

JMeter —— 接口自动化测试(数据驱动)

前言 之前我们的用例数据都是配置在HTTP请求中&#xff0c;每次需要增加&#xff0c;修改用例都需要打开JMeter重新编辑&#xff0c;当用例越来越多的时候&#xff0c;用例维护起来就越来越麻烦&#xff0c;有没有好的方法来解决这种情况呢&#xff1f;我们可以将用例的数据存…

Linux学习笔记5-GPIO(3)

经过之前的学习&#xff0c;想开始利用GPIO做一些简单的开发板应用了&#xff0c;做个程序完成2个功能 1.LED灯闪灭 2.通过按键来控制输出&#xff0c;控制开发板的蜂鸣器蜂鸣第一个功能&#xff0c;LED闪灭比较简单&#xff0c;可以写一个led_switch函数&#xff0c;仍然是操…