您的位置:首页 > 健康 > 养生 > 网页设计的心得500字_企业网站优化方法包括_沈阳网站建设制作公司_企业建设网站公司

网页设计的心得500字_企业网站优化方法包括_沈阳网站建设制作公司_企业建设网站公司

2025/7/6 12:54:36 来源:https://blog.csdn.net/cclethe/article/details/144996175  浏览:    关键词:网页设计的心得500字_企业网站优化方法包括_沈阳网站建设制作公司_企业建设网站公司
网页设计的心得500字_企业网站优化方法包括_沈阳网站建设制作公司_企业建设网站公司

文章目录

    • 原理
      • ptrace系统调用
      • 使用ptrace跟踪进程
    • 使用
      • 跟踪可执行程序
      • 跟踪服务程序
      • 获取系统调用统计
      • 获取系统调用用时
      • 获取系统调用的时间
    • 参考

strace命令是一个集诊断、调试、统计与一体的工具,可以用来追踪和调试程序。strace可以跟踪到一个进程产生的系统调用,包括参数,返回值,执行消耗的时间。

原理

strace 的原理是通过拦截目标进程的系统调用来进行跟踪,而如何拦截目标进程的系统调用可以通过linux提供的ptrace特性来实现。

ptrace系统调用

ptrace系统调用提供了一种方法来跟踪和控制进程的执行,它可以读取和修改进程地址空间中的内容,包括寄存器的值。ptrace主要用于实现断点调试和跟踪系统调用。该系统调用的原型如下:

       #include <sys/ptrace.h>long ptrace(enum __ptrace_request op, pid_t pid,void *addr, void *data);

ptrace的四个参数的含义为:

  1. request:用于选择一个操作,见下文。

  2. pid:目标进程即被跟踪进程的pid。

  3. addr和data用于修改和拷贝被跟踪进程的进程地址空间的数据。

下面的内容中将用父进程指代跟踪者,用子进程指代被跟踪者。实际上,在一个进程被跟踪之后,跟踪者进程会在某种意义上充当被跟踪进程的父进程(如使用ps命令就可以看到他们的父子关系),而子进程真正的父进程被保存在其task_struct结构的real_parent成员中。

使用ptrace跟踪进程

父进程跟踪一个进程的方式有两种:

  1. 调用fork(),然后子进程打上PTRACE_TRACEME标记,并执行exec。
  2. 父进程可以给自己打上PTRACE_ATTACH标记来跟踪一个已有进程。

一个进程被跟踪后,他只要接收到一个信号(即使这个信号被设置为忽略)就会停止运行(SIGKILL除外),然后父进程会在每次调用wait()时得到子进程停止运行的通知,这时父进程就可以检测和修改子进程了,随后父进程可以让子进程继续运行。

当父进程不想跟踪了,可以通过设置PTRACE_KILL标记来终止子进程的运行。也可以通过设置PTRACE_DETACH标记让子进程解除被跟踪,继续正常运行。

使用

strace --help
Usage: strace [-ACdffhikqqrtttTvVwxxyyzZ] [-I N] [-b execve] [-e EXPR]...[-a COLUMN] [-o FILE] [-s STRSIZE] [-X FORMAT] [-O OVERHEAD][-S SORTBY] [-P PATH]... [-p PID]... [-U COLUMNS] [--seccomp-bpf]{ -p PID | [-DDD] [-E VAR=VAL]... [-u USERNAME] PROG [ARGS] }or: strace -c[dfwzZ] [-I N] [-b execve] [-e EXPR]... [-O OVERHEAD][-S SORTBY] [-P PATH]... [-p PID]... [-U COLUMNS] [--seccomp-bpf]{ -p PID | [-DDD] [-E VAR=VAL]... [-u USERNAME] PROG [ARGS] }General:-e EXPR        a qualifying expression: OPTION=[!]all or OPTION=[!]VAL1[,VAL2]...options:    trace, abbrev, verbose, raw, signal, read, write, fault,inject, status, quiet, kvm, decode-fds...

更加详细的解释可以参考man strace的输出。

跟踪可执行程序

strace -f -o ls.txt ls`	

-f 选项告诉strace同时跟踪fork和vfork出来的进程,-o选项把所有strace输出写到log.txt里 面,ls是要启动和调试的程序。

跟踪服务程序

strace -o hello.txt -T -tt -e trace=all -p 52807
跟踪52807进程的所有系统调用(-e trace=all),并统计系统调用的花费时间,以及开始时间(并以可视化的时分秒格式显示),最后将记录结果存在hello.txt文件里面。

获取系统调用统计

$ strace -c ls
conky-manager2  libguestfs
% time     seconds  usecs/call     calls    errors syscall
------ ----------- ----------- --------- --------- ----------------44.77    0.000587         587         1           execve32.42    0.000425          23        18           mmap6.94    0.000091          13         7           openat3.28    0.000043           5         8           fstat2.97    0.000039           7         5           read2.90    0.000038           4         9           close2.14    0.000028           9         3           brk1.68    0.000022          11         2           pread641.45    0.000019           9         2         2 access0.69    0.000009           1         5           mprotect0.23    0.000003           3         1           arch_prctl0.23    0.000003           3         1           set_robust_list0.15    0.000002           2         1           set_tid_address0.15    0.000002           2         1           rseq0.00    0.000000           0         1           write0.00    0.000000           0         1           munmap0.00    0.000000           0         2           ioctl0.00    0.000000           0         2         2 statfs0.00    0.000000           0         2           getdents640.00    0.000000           0         1           prlimit640.00    0.000000           0         1           getrandom
------ ----------- ----------- --------- --------- ----------------
100.00    0.001311          17        74         4 total

获取系统调用用时

strace可以使用参数-T将每个系统调用所花费的时间打印出来,每个调用的时间花销现在在调用行最右边的尖括号里面。

strace -T ls
execve("/usr/bin/ls", ["ls"], 0x7ffce424d218 /* 82 vars */) = 0 <0.000785>
brk(NULL)                               = 0x55a61df4e000 <0.000044>
mmap(NULL, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f414709e000 <0.000124>
access("/etc/ld.so.preload", R_OK)      = -1 ENOENT (No such file or directory) <0.000099>
openat(AT_FDCWD, "/etc/ld.so.cache", O_RDONLY|O_CLOEXEC) = 3 <0.000114>
fstat(3, {st_mode=S_IFREG|0644, st_size=159202, ...}) = 0 <0.000029>
mmap(NULL, 159202, PROT_READ, MAP_PRIVATE, 3, 0) = 0x7f4147077000 <0.000044>
close(3)                                = 0 <0.000027>
openat(AT_FDCWD, "/lib/x86_64-linux-gnu/libselinux.so.1", O_RDONLY|O_CLOEXEC) = 3 <0.000041>
read(3, "\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0\0\0\0\0\0\0\0\0"..., 832) = 832 <0.000030>
fstat(3, {st_mode=S_IFREG|0644, st_size=186600, ...}) = 0 <0.000027>
mmap(NULL, 194256, PROT_READ, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x7f4147047000 <0.000039>
mmap(0x7f414704e000, 118784, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x7000) = 0x7f414704e000 <0.000054>
mmap(0x7f414706b000, 32768, PROT_READ, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x24000) = 0x7f414706b000 <0.000040>
mmap(0x7f4147073000, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x2c000) = 0x7f4147073000 <0.000042>
mmap(0x7f4147075000, 5840, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0x7f4147075000 <0.000038>
close(3)                                = 0 <0.000028>
...

获取系统调用的时间

strace会将每次系统调用的发生时间记录下来,只要使用-t/tt/ttt三个参数就可以看到效果了。

strace -tt ls
00:00:44.726685 execve("/usr/bin/ls", ["ls"], 0x7fff9f23f798 /* 82 vars */) = 0
00:00:44.727703 brk(NULL)               = 0x5604dbfc4000
00:00:44.728075 mmap(NULL, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f27ad965000
00:00:44.728310 access("/etc/ld.so.preload", R_OK) = -1 ENOENT (No such file or directory)
00:00:44.728589 openat(AT_FDCWD, "/etc/ld.so.cache", O_RDONLY|O_CLOEXEC) = 3
00:00:44.728787 fstat(3, {st_mode=S_IFREG|0644, st_size=159202, ...}) = 0
00:00:44.728958 mmap(NULL, 159202, PROT_READ, MAP_PRIVATE, 3, 0) = 0x7f27ad93e000
00:00:44.729119 close(3)                = 0
00:00:44.729239 openat(AT_FDCWD, "/lib/x86_64-linux-gnu/libselinux.so.1", O_RDONLY|O_CLOEXEC) = 3
00:00:44.729360 read(3, "\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0\0\0\0\0\0\0\0\0"..., 832) = 832
00:00:44.729468 fstat(3, {st_mode=S_IFREG|0644, st_size=186600, ...}) = 0
00:00:44.729596 mmap(NULL, 194256, PROT_READ, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x7f27ad90e000
00:00:44.729719 mmap(0x7f27ad915000, 118784, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x7000) = 0x7f27ad915000
00:00:44.729859 mmap(0x7f27ad932000, 32768, PROT_READ, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x24000) = 0x7f27ad932000
00:00:44.729988 mmap(0x7f27ad93a000, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x2c000) = 0x7f27ad93a000
00:00:44.730118 mmap(0x7f27ad93c000, 5840, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0x7f27ad93c000
00:00:44.730248 close(3)                = 0...
参数名输出样式说明
-t00:01:20 close(3)输出结果精确到秒
-tt00:00:44.729119 close(3)输出结果精确到微秒
-ttt1736438494.952739 close(3)精确到微秒,而且时间表示为unix时间戳

参考

strace: linux syscall tracer
strace/strace
strace 跟踪进程中的系统调用
strace(1) — Linux manual page
strace工具的实现原理
Strace是如何工作的 ?
How does strace work?
The Definitive Guide to Linux System Calls
Anatomy of a system call, part 2
Intel® 64 and IA-32 Architectures Software Developer’s Manual Volume 3A: System Programming Guide, Part 1
System Call Tracing using ptrace
How does ptrace work in Linux?
strace 源码分析
Filter and Modify System Calls with seccomp and ptrace
ptrace(2) — Linux manual page

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com