strace

What are the differences between LD_PRELOAD and strace?

自古美人都是妖i 提交于 2020-05-26 04:10:23
问题 Both methods are used to gather system calls also parameters and return values of them. When we prefer LD_PRELOAD and why? Maybe we can say that we can only gather syscalls via strace but we can gather library calls with LD_PRELOAD trick. However, there is another tracer for libraries whose name is ltrace . 回答1: strace is using the ptrace(2) syscall (with PTRACE_SYSCALL probably), so will catch every system call (thru kernel hooks installed by ptrace ). It will work on any executable, even on

What are the differences between LD_PRELOAD and strace?

三世轮回 提交于 2020-05-26 04:08:01
问题 Both methods are used to gather system calls also parameters and return values of them. When we prefer LD_PRELOAD and why? Maybe we can say that we can only gather syscalls via strace but we can gather library calls with LD_PRELOAD trick. However, there is another tracer for libraries whose name is ltrace . 回答1: strace is using the ptrace(2) syscall (with PTRACE_SYSCALL probably), so will catch every system call (thru kernel hooks installed by ptrace ). It will work on any executable, even on

linux shell 中"2>&1"含义

五迷三道 提交于 2020-05-07 19:53:21
转自 https://blog.csdn.net/ithomer/article/details/9288353 shell中可能经常能看到:echo log > /dev/null 2>&1 命令的结果可以通过%>的形式来定义输出 /dev/null :代表空设备文件 > :代表重定向到哪里,例如:echo "123" > /home/123.txt 1 :表示stdout标准输出,系统默认值是1,所以">/dev/null"等同于"1>/dev/null" 2 :表示stderr标准错误 & :表示等同于的意思,2>&1,表示2的输出重定向等同于1 1 > /dev/null 2>&1 语句含义: 1 > /dev/null : 首先表示标准输出重定向到空设备文件,也就是不输出任何信息到终端,说白了就是不显示任何信息。 2>&1 :接着,标准错误输出重定向(等同于)标准输出,因为之前标准输出已经重定向到了空设备文件,所以标准错误输出也重定向到空设备文件。 实例解析: cmd >a 2>a 和 cmd >a 2>&1 为什么不同? cmd >a 2>a :stdout和stderr都直接送往文件 a ,a文件会被打开两遍,由此导致stdout和stderr互相覆盖。 cmd >a 2>&1 :stdout直接送往文件a ,stderr是继承了FD1的管道之后,再被送往文件a

stress施压案例分析——cpu、io、mem【命令分析】

£可爱£侵袭症+ 提交于 2020-05-02 03:49:39
stress施压命令分析 一、stress --cpu 1 --timeout 600 分析现象?负载为啥这么高?top命令查看用户进程消耗的cpu过高(stress进程消耗的) 分析现象,可以看出负载很高,用户态的cpu的使用率是100%,stress进程使用的cpu也接近100%。 问题:负载为什么接近于1?? # vmstat 1 查看监控信息 负载=r+b,这是一个瞬时值。 下图可以看出r+b为1,所以这里的负载为1。 这里负载不为2的原因,这里只有一核cpu在干活,也只有一个进程在消耗cpu,所以这里负载是1,不会是2。 二、stress -i 1 --timeout 600 分析现象?top看负载升高,内核cpu过高? iostat -x 3 stress消耗cpu多,iowait 等待 pidstat -d 正常情况下,这里的iowait也是有数据的,不是0,应该会涨,可能是操作系统版本的原因,或者用stress-ng版本这个加强版 下载地址: https://kernel.ubuntu.com/~cking/tarballs/stress-ng/ 安装步骤和stress一样的,需要编译安装。 高版本的stress-ng编译需要高版本的gcc,我这里以前是4.4.7版本的 gcc下载地址: http://www.gnu.org/prep/ftp.html 分析步骤:

shell脚本之十:while循环及应用实践

妖精的绣舞 提交于 2020-04-30 10:11:55
十、while循环及应用实践 (一)while循环语法 while 循环语法: while <条件表达式> do 指令 done (二)范例1: 每隔2s输出系统负载情况。 [root@centos6-kvm3 scripts]# cat 10-01.sh #!/bin/bash while true do uptime >>/tmp/oldboy.log sleep 2 done [root@centos6-kvm3 scripts]# 1、脚本执行的方法 用法 说明 sh while1.sh & 把脚本while1.sh放到后台执行(后台运行脚本时常用)* nohup while1.sh & 使用nohup 把脚本while.sh放到后台执行。 ctl+c 停止执行当前脚本或者任务 ctl+z 暂停执行当前脚本或者任务 bg 把当前脚本或者任务放到后台执行,bg可以理解为backround fg 把当前脚本或者任务拿到前台执行,如果有多个任务,可以使用fg加任务编号调出对应脚本任务,如fg 2,调出第二个脚本任务,fg可以理解为frontground jobs 查看当前执行的脚本或者任务 kill 关闭执行的脚本任务,即以“kill %任务编号”的形式关闭脚本,这个任务标号,可以通过jobs获得。 后台运行 & ,nohup,screen(运维人员) 常用命令: kill

句柄数过高分析

自作多情 提交于 2020-04-18 07:56:01
too many open files"这条报错信息,它的实际含义是文件描述符数量超限。用ulimit -a命令打印出各限制值: 查看句柄数 ulimit -a 修改句柄数 vi /etc/security/limits.conf 添加 *  soft  nofile  100000 *  hard  nofile  100000 for x in ps -eF| awk '{ print $2 }' ;do echo ls /proc/$x/fd 2> /dev/null | wc -l $x cat /proc/$x/cmdline 2> /dev/null ;done | sort -n -r | head -n 20 查看文件描述符前20 netstat -tan|awk '$1~/tcp/{print $NF}'|sort|uniq -c|sort -nr 查看当前连接状况 strace -F -p 5351 -T -tt -o trace.log strace情况 -c 统计每一系统调用的所执行的时间,次数和出错的次数等. -d 输出strace关于标准错误的调试信息. -f 跟踪由fork调用所产生的子进程. -ff 如果提供-o filename,则所有进程的跟踪结果输出到相应的filename.pid中,pid是各进程的进程号. -F 尝试跟踪vfork调用.在

深入理解 Linux磁盘顺序写、随机写

偶尔善良 提交于 2020-04-14 17:50:38
【推荐阅读】微服务还能火多久?>>> Linux 磁盘管理好坏直接关系到整个系统的性能问题。Linux磁盘管理常用三个 命令 为df、du和fdisk。 一、前言 ● 随机写会导致磁头不停地换道,造成效率的极大降低;顺序写磁头几乎不用换道,或者换道的时间很短 ● 本文来讨论一下两者具体的差别以及相应的内核调用 二、环境准备 组件 版本 OS Ubuntu 16.04.4 LTS fio 2.2.10 三、fio介绍 通过fio测试,能够反映在读写中的状态,我们需要重点关注fio的输出报告中的几个关键指标: slat :是指从 I/O 提交到实际执行 I/O 的时长(Submission latency) clat :是指从 I/O 提交到 I/O 完成的时长(Completion latency) lat :指的是从 fio 创建 I/O 到 I/O 完成的总时长 bw :吞吐量 iops :每秒 I/O 的次数 四、同步写测试 (1)同步随机写 主要采用fio作为测试工具,为了能够看到系统调用,使用strace工具, 命令 看起来是这样: 先来测试一个随机写 strace -f -tt -o /tmp/randwrite.log -D fio -name=randwrite -rw=randwrite \ -direct=1 -bs=4k -size=1G -numjobs=1

UNIX/Linux系统取证之信息采集案例

邮差的信 提交于 2020-04-09 20:29:04
UNIX/Linux系统取证之信息采集案例 在UNIX/Linux系统取证中,及时收集硬盘的信息至关重要,《Unix/Linux网络日志分析与流量监控》一书中,将详细讨论各种常见系统进程系统调用及镜像文件获取方法。下面简单举几个例子。 1.收集正在运行的进程 在UNIX/Linux取证时很多系统和网络信息是短时存在的可谓是转瞬即逝,如何准确的捕捉到哪些蛛丝马迹呢?网络安全人员需要具有敏锐的观察力和丰富的经验下面例举几个常用的方法。 首先,在收集主机上启动一个监听进程: #nc -l -p 10005 >ps_lsof_log 执行完这条命令后回车,系统打开10005端口等待接受,然后在被调查的另一主机上运行相应的ps 调用: #(ps aux; ps-auxeww; lsof)|nc 192.168.150.100 10005 -w 3 几秒钟后回到命令行提示符,需要注意的是这两条命令成对出现,发送完数据后开启的端口接收数据接收完毕即关闭端口,如果你第二次没有开启监听端口,继续发送ps数据就会出现连接访问拒绝。 #(ps aux;ps auxeww;losf) | nc 192.168.150.109 10005 –w 3 (UNKNOWN) [192.168.150.109] 10005 (?) : Conection refused 在上述命令中,有的命令产生长输出结果

[转帖]浅谈Linux进程模型

折月煮酒 提交于 2020-03-23 13:29:35
浅谈Linux进程模型 https://blog.lecury.cn/2019/04/04/浅谈Linux进程模型/ 写在前面 进程基础 进程概念 进程描述符 进程创建 上下文切换 init进程 进程应用 进程间通信 信号处理 后台进程与守护进程 浅谈nginx多进程模型 常用工具介绍 ps: 查看进程属性 lsof: 查看打开的文件情况 netstat: 查看网络连接情况 strace: 查看系统调用情况 进程基础 基础概念 进程是操作系统的基本概念之一,它是操作系统分配资源的基本单位,也是程序执行过程的实体。程序是代码和数据的集合,本身是一个静态的概念,而进程是程序的一次执行的实体,是一个动态的概念。 那在Linux操作系统中,是如何描述一个进程的呢? 进程描述符 为了管理进程,内核需要对每个进程的属性和所需要做的事情,进行清楚的描述,这个就是进程描述符的作用,Linux中的进程描述符由 task_struct 标识。 task_struct 的数据结构是相当复杂的,不仅包含了很进程属性的字段,而且也包括了指向其他数据结构的指针。大致结构如下: state: 描述进程状态 thread_info: 进程的基本信息 mm: mm_struct 指向内存区描述符的指针 tty: tty_struct 终端相关的描述符 fs: fs_struct 当前目录 files: files

redis报错:read error on connection的两种原因分析

左心房为你撑大大i 提交于 2020-03-09 18:18:40
最近线上php模块偶现 read error on connection;具体报错日志如下 Uncaught exception 'RedisException' with message ' read error on connection' 通过分析和学习之后,发现两种原因可能导致 phpredis 返回 'read error on connection': 执行超时 使用已经断开的连接 下面将对这两种情况进行具体的分析。 一、执行超时 超时又可以分两种情况:一种是客户端设置的超时时间过短导致的;另外一种是客户端未设置超时时间,但是服务端执行时间超过了默认超时时间设置。 1.1 模拟复现 1.1.1 客户端设置超时时间过短 测试环境的 get 操作 执行耗时约 0.1ms 数量级;因此客户端设置执行超时时间为0.01ms, 测试脚本如下: <?php $rds = new Redis(); try { $ret = $rds->pconnect( "127.0.0.1" , 6390 ); if ($ret == false ) { echo "Connect return false" ; exit ; } //设置超时时间为 0.1ms $rds->setOption( 3 , 0.0001 ); $rds->get( "aa" ); } catch (