linux下strace命令是强大,今天来学习一下。利用strace命令可以追踪系统调用和信号值。

学习用的测试代码如下:

[root@localhost mapan]# cat test.cpp
#include <iostream>
using namespace std;int main()
{int a;cin >> a;cout << a << endl;return 0;
}
[root@localhost mapan]# g++ test.cpp
[root@localhost mapan]# ls
a.out  test.cpp
[root@localhost mapan]#

用strace来跟踪信号传递

[root@localhost mapan]# strace ./a.out
execve("./a.out", ["./a.out"], [/* 28 vars */]) = 0
brk(NULL)                               = 0x896000
mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7ffbd1f20000
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=23944, ...}) = 0
mmap(NULL, 23944, PROT_READ, MAP_PRIVATE, 3, 0) = 0x7ffbd1f1a000
close(3)                                = 0
open("/lib64/libstdc++.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 \262\5\0\0\0\0\0"..., 832) = 832
fstat(3, {st_mode=S_IFREG|0755, st_size=991616, ...}) = 0
mmap(NULL, 3171168, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x7ffbd19f9000
mprotect(0x7ffbd1ae2000, 2093056, PROT_NONE) = 0
mmap(0x7ffbd1ce1000, 40960, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0xe8000) = 0x7ffbd1ce1000
mmap(0x7ffbd1ceb000, 82784, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0x7ffbd1ceb000
close(3)                                = 0
open("/lib64/libm.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\0pS\0\0\0\0\0\0"..., 832) = 832
fstat(3, {st_mode=S_IFREG|0755, st_size=1139680, ...}) = 0
mmap(NULL, 3150136, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x7ffbd16f7000
mprotect(0x7ffbd17f8000, 2093056, PROT_NONE) = 0
mmap(0x7ffbd19f7000, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x100000) = 0x7ffbd19f7000
close(3)                                = 0
open("/lib64/libgcc_s.so.1", O_RDONLY|O_CLOEXEC) = 3
read(3, "\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0\220*\0\0\0\0\0\0"..., 832) = 832
fstat(3, {st_mode=S_IFREG|0755, st_size=88776, ...}) = 0
mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7ffbd1f19000
mmap(NULL, 2184192, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x7ffbd14e1000
mprotect(0x7ffbd14f6000, 2093056, PROT_NONE) = 0
mmap(0x7ffbd16f5000, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x14000) = 0x7ffbd16f5000
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\0P%\2\0\0\0\0\0"..., 832) = 832
fstat(3, {st_mode=S_IFREG|0755, st_size=2173512, ...}) = 0
mmap(NULL, 3981792, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x7ffbd1114000
mprotect(0x7ffbd12d7000, 2093056, PROT_NONE) = 0
mmap(0x7ffbd14d6000, 24576, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x1c2000) = 0x7ffbd14d6000
mmap(0x7ffbd14dc000, 16864, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0x7ffbd14dc000
close(3)                                = 0
mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7ffbd1f18000
mmap(NULL, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7ffbd1f16000
arch_prctl(ARCH_SET_FS, 0x7ffbd1f16740) = 0
mprotect(0x7ffbd14d6000, 16384, PROT_READ) = 0
mprotect(0x7ffbd16f5000, 4096, PROT_READ) = 0
mprotect(0x7ffbd19f7000, 4096, PROT_READ) = 0
mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7ffbd1f15000
mprotect(0x7ffbd1ce1000, 32768, PROT_READ) = 0
mprotect(0x600000, 4096, PROT_READ)     = 0
mprotect(0x7ffbd1f21000, 4096, PROT_READ) = 0
munmap(0x7ffbd1f1a000, 23944)           = 0
fstat(0, {st_mode=S_IFCHR|0620, st_rdev=makedev(136, 0), ...}) = 0
mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7ffbd1f1f000
read(0,

上面都的一些系统调用都是做进程初始化工作,现在卡在read那里了,等待读取一个数。然后打开另一个窗口kill掉这个进程,kill结果如下:

mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7ffbd1f1f000
read(0, Killed
[root@localhost mapan]#

显示killed

strace -c 统计系统调用分析的结果

[root@localhost mapan]# strace -c ./a.out
1
1
% time     seconds  usecs/call     calls    errors syscall
------ ----------- ----------- --------- --------- ----------------0.00    0.000000           0         5           read0.00    0.000000           0         1           write0.00    0.000000           0         5           open0.00    0.000000           0         5           close0.00    0.000000           0         7           fstat0.00    0.000000           0        18           mmap0.00    0.000000           0        10           mprotect0.00    0.000000           0         1           munmap0.00    0.000000           0         1           brk0.00    0.000000           0         1         1 access0.00    0.000000           0         1           execve0.00    0.000000           0         1           arch_prctl
------ ----------- ----------- --------- --------- ----------------
100.00    0.000000                    56         1 total
[root@localhost mapan]#

上面有显示系统调用执行的次数和耗用的时间。

strace -T 打印每个系统调用所花的时间

[root@localhost mapan]# strace -T ./a.out
execve("./a.out", ["./a.out"], [/* 28 vars */]) = 0 <0.000716>
brk(NULL)                               = 0x112f000 <0.000295>
mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f900a676000 <0.000284>
access("/etc/ld.so.preload", R_OK)      = -1 ENOENT (No such file or directory) <0.000305>
open("/etc/ld.so.cache", O_RDONLY|O_CLOEXEC) = 3 <0.000284>
fstat(3, {st_mode=S_IFREG|0644, st_size=23944, ...}) = 0 <0.000308>
mmap(NULL, 23944, PROT_READ, MAP_PRIVATE, 3, 0) = 0x7f900a670000 <0.000015>
close(3)                                = 0 <0.000008>
open("/lib64/libstdc++.so.6", O_RDONLY|O_CLOEXEC) = 3 <0.000016>
read(3, "\177ELF\2\1\1\3\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0 \262\5\0\0\0\0\0"..., 832) = 832 <0.000013>
fstat(3, {st_mode=S_IFREG|0755, st_size=991616, ...}) = 0 <0.000011>
mmap(NULL, 3171168, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x7f900a14f000 <0.000014>
mprotect(0x7f900a238000, 2093056, PROT_NONE) = 0 <0.000012>
mmap(0x7f900a437000, 40960, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0xe8000) = 0x7f900a437000 <0.000013>
mmap(0x7f900a441000, 82784, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0x7f900a441000 <0.000016>
close(3)                                = 0 <0.000012>
open("/lib64/libm.so.6", O_RDONLY|O_CLOEXEC) = 3 <0.000016>
read(3, "\177ELF\2\1\1\3\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0pS\0\0\0\0\0\0"..., 832) = 832 <0.000012>
fstat(3, {st_mode=S_IFREG|0755, st_size=1139680, ...}) = 0 <0.000009>
mmap(NULL, 3150136, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x7f9009e4d000 <0.000012>
mprotect(0x7f9009f4e000, 2093056, PROT_NONE) = 0 <0.000016>
mmap(0x7f900a14d000, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x100000) = 0x7f900a14d000 <0.000015>
close(3)                                = 0 <0.000007>
open("/lib64/libgcc_s.so.1", O_RDONLY|O_CLOEXEC) = 3 <0.000017>
read(3, "\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0\220*\0\0\0\0\0\0"..., 832) = 832 <0.000008>
fstat(3, {st_mode=S_IFREG|0755, st_size=88776, ...}) = 0 <0.000008>
mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f900a66f000 <0.000012>
mmap(NULL, 2184192, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x7f9009c37000 <0.000010>
mprotect(0x7f9009c4c000, 2093056, PROT_NONE) = 0 <0.000011>
mmap(0x7f9009e4b000, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x14000) = 0x7f9009e4b000 <0.000012>
close(3)                                = 0 <0.000010>
open("/lib64/libc.so.6", O_RDONLY|O_CLOEXEC) = 3 <0.000013>
read(3, "\177ELF\2\1\1\3\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0P%\2\0\0\0\0\0"..., 832) = 832 <0.000011>
fstat(3, {st_mode=S_IFREG|0755, st_size=2173512, ...}) = 0 <0.000011>
mmap(NULL, 3981792, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x7f900986a000 <0.000011>
mprotect(0x7f9009a2d000, 2093056, PROT_NONE) = 0 <0.000015>
mmap(0x7f9009c2c000, 24576, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x1c2000) = 0x7f9009c2c000 <0.000016>
mmap(0x7f9009c32000, 16864, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0x7f9009c32000 <0.000010>
close(3)                                = 0 <0.000007>
mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f900a66e000 <0.000408>
mmap(NULL, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f900a66c000 <0.000009>
arch_prctl(ARCH_SET_FS, 0x7f900a66c740) = 0 <0.000007>
mprotect(0x7f9009c2c000, 16384, PROT_READ) = 0 <0.000012>
mprotect(0x7f9009e4b000, 4096, PROT_READ) = 0 <0.000011>
mprotect(0x7f900a14d000, 4096, PROT_READ) = 0 <0.000011>
mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f900a66b000 <0.000237>
mprotect(0x7f900a437000, 32768, PROT_READ) = 0 <0.000011>
mprotect(0x600000, 4096, PROT_READ)     = 0 <0.000011>
mprotect(0x7f900a677000, 4096, PROT_READ) = 0 <0.000012>
munmap(0x7f900a670000, 23944)           = 0 <0.000016>
fstat(0, {st_mode=S_IFCHR|0620, st_rdev=makedev(136, 0), ...}) = 0 <0.000303>
mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f900a675000 <0.000013>
read(0, 

brk(NULL)                               = 0x112f000 <0.000295>         0.000295就是对于brk系统调用所花的时间

fstat(3, {st_mode=S_IFREG|0644, st_size=23944, ...}) = 0 <0.000308>     0.000308就是对于fstat系统调用所花的时间

strace -i 输出系统调用的入口指针,还可以显示具体在那个地址上进行调用 ,可以用来调试coredump

详细见:https://blog.csdn.net/ma2595162349/article/details/51472328

strace -p 调试进程下篇讲

strace命令学习相关推荐

  1. linux的strace命令

    linux的strace命令 strace 命令是一种强大的工具,它能够显示所有由用户空间程序发出的系统调用. strace 显示这些调用的参数并返回符号形式的值.strace 从内核接收信息,而且不 ...

  2. php strace 工具,Linux程序调试工具工具—strace命令

    1.简介 strace是Linux环境下的一款程序调试工具,用来检察一个应用程序所使用的系统调用.Strace是一个简单的跟踪系统调用执行的工具.在其最简单的形式中,它可以从开始到结束跟踪二进制的执行 ...

  3. strace命令用法

    strace命令用法   调用: strace [ -dffhiqrtttTvxx ] [ -acolumn ] [ -eexpr ] ... [ -ofile ] [ -ppid ] ... [ - ...

  4. linux的strace命令(详解)

    linux的strace命令(详解) 本文详细讲述linux下的strace命令的用法. strace 命令是一种强大的工具,它能够显示所有由用户空间程序发出的系统调用. strace 显示这些调用的 ...

  5. strace命令(收集整理,常看常新)

    starce的用途和参数:http://man.linuxde.net/strace(linux命令大全) strace命令是一个集诊断.调试.统计与一体 的工具,我们可以使用strace对应用的系统 ...

  6. 性能分析工作strace命令用法详解及使用例子

    1 功能说明 strace 命令是一种强大的工具, 能够显示任何由用户空间程式发出的系统调用. strace 显示这些调用的参数并返回符号形式的值. strace 从内核接收信息, 而且无需以任何特别 ...

  7. Linux命令学习资料总结

    对 Linux 新手非常有用的 20 个命令 1. ls命令 ls命令是列出目录内容(List Directory Contents)的意思.运行它就是列出文件夹里的内容,可能是文件也可能是文件夹. ...

  8. strace命令用法详解

    11-15 Web开发 Dante 7,290 strace命令用法详解 11-15 7,290 调用: strace [ -dffhiqrtttTvxx ] [ -acolumn ] [ -eexp ...

  9. 《Linux命令学习手册》系列分享专栏

    <Linux命令学习手册>系列分享专栏 <Linux命令学习手册>已整理成PDF文档,点击可直接下载至本地查阅 https://www.webfalse.com/read/20 ...

最新文章

  1. 用 Flask 来写个轻博客 (35) — 使用 Flask-RESTful 来构建 RESTful API 之四
  2. java 多线程 异步日志_精彩技巧(1)-- 异步打印日志的一点事
  3. Zookeepe实践与应用--分布队列
  4. LeetCode MySQL 1045. 买下所有产品的客户
  5. Hibernate5-一对多双向关联-迫切左外连接-HQL
  6. oracle修改字符集_oracle修改数据库字符集
  7. 图解TCPOP-SMTP
  8. Qt4_在Qt设计师中集成自定义窗口部件
  9. 数学倒底有没有绝对的严格性和形式化?
  10. 卓越、当当、京东三大广告联盟比较
  11. The app references non-public selectors in payload With Xcode6.1
  12. 关于2019中国移动广西分公司社会招聘互联网电视维护岗位笔试、面试经验分享
  13. 中央气象台气象监测数据爬取Python实战分析
  14. 学习linux的第一天知识总结
  15. 微信支付接口调用问题(android正常,iphone调不起)
  16. vscode 热门插件超实用插件汇总——vscode使用必看
  17. java long类型值不能为0_关于原始类型:Java:为什么不能将int转换为Long
  18. VCN 在windows和linux之间 复制粘贴
  19. left out join举例
  20. 利用convert【ImageMagick】把pdf批量转换为图片踩坑(gs报错和清晰度问题)

热门文章

  1. 【Netty】使用 Netty 开发 HTTP 服务器
  2. 二叉树的概念、算法简介及树的平衡
  3. C语言 · 矩阵乘法
  4. Python进阶03 模块
  5. [Angular2 Form] Style Validation in Angular 2 Forms
  6. 阅读微信支付demo收获
  7. TCP/IP 与OSI结构图
  8. 桌面应用程序员简单尝试Rich JavaScript Application
  9. 英语单词 factor cull
  10. 三次简化一张图:一招理解LSTM/GRU门控机制