五花八门客户问题(BUG) - 用好strace

strace是Linux下强大的诊断、调试工具,用于跟踪进程的系统调用和信号。它能帮助理解应用程序如何与内核交互,解决如客户replication功能故障等问题。通过strace,我们可以查看系统调用细节,例如在客户问题中发现连接错误或分析性能瓶颈。strace的原理基于ptrace,它可以自我追踪,展示其内部系统调用过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

strace简介

strace是一个用于跟踪系统调用和信号传递的Linux命令,它是一个集诊断、调试、统计于一体的工具。strace可以监控用户空间进程和内核的交互,比如系统调用、信号传递、进程状态变更等。它底层使用内核的ptrace特性来实现其功能。

strace最简单的用法是执行一个指定的命令,在命令执行的过程中,strace会记录和解析该进程的所有系统调用以及所接收到的所有信号值。通过strace对应用的系统调用和信号传递的跟踪结果,可以对应用进行分析,以达到解决问题或者是了解应用工作过程的目的。

我的理解

strace是一种经常被support或者开发测试粗粒度调查问题的极好用的工具。遇到问题茫然无知,只看到进程报错,这是第一步;然后启用放大镜strace,它能看到系统调用函数这一层,对support基本够用了,他能看看哪个函数返回-1了或者卡主了或者与没问题的版本比是否多调用了哪个函数等等;最后一层那就是启用显微镜了,也就是到了源代码这一层,用gdb调试。gdb虽然厉害,但是信息太多,那么多代码没有点经验的话可就属于大海捞针了。遇到问题何不先用轻武器strace试试?

strace定位问题例子一

客户问题:客户replication功能不好用,具体是两端sync不上。

客户本人很厉害,自己用strace看到connect函数返回问号,如下所示:

uvrepmanager process:
13:56:51.780992 msgrcv(4, {1000, "\16\0\0\0\371\377\377\377\213\t\0\0

As you can see, the timing does not exactly match, however, most of the content does (there is more for the repmanager process).
Here is what appears to be sent to XXX by the repmanager:
13:56:52.268790 socket(AF_INET, SOCK_STREAM, IPPROTO_TCP) = 4

13:56:52.268826 connect(4, {sa_family=AF_INET, sin_port=htons(31438), sin_addr=inet_addr("10.0.12.175")}, 16) = ? ERESTARTSYS (To be restarted if SA_RESTART is set)

13:56:53.781041 --- SIGALRM {si_signo=SIGALRM, si_code=SI_KERNEL} ---

13:56:53.781088 rt_sigaction(SIGALRM, {sa_handler=0x7fabf9e17395, sa_mask=[], sa_flags=SA_RESTORER, sa_restorer=0x7fabf779400}, {sa_handler=0x7fabf9e7395, sa_mask=[], sa_flags=SA_RESTORER, sa_restorer=0x7fabf779400}, 8) = 0

13:56:53.781138 rt_sigprocmask(SIG_UNBLOCK, [ALRM], [ALRM], 8) = 0

最后他自己就想到了端口开没,问题都没到开发这层。

strace定位问题例子二

客户问题:Replication会把所有的增删改同步到从数据库,但是删除表操作耗时长

解决方案:因为两端都会做删除表操作,主数据库很快,从数据库很慢,所以我们建议客户分别strace两端的进程对比下。最后看到了从数据库

*nanosleep({1*, 0}, 0x7fffd8ea940) = 0

也就是sleep 1秒,很快就找到了对应的代码行。把代码优化下搞定!

strace原理

也许你已经听烂了strace原理,一句话:strace是一个基于ptrace函数实现的命令行工具。strace使用ptrace函数的功能来拦截目标进程的系统调用,并打印出详细的调用信息,从而帮助用户了解程序在操作系统中的行为。

你可以直接看源码

不过我今天从一个新奇的思路看一看:用strace 来追踪strace用了哪些系统函数,看下里面包括ptrace函数不?用strace卷自个!

#strace -c strace ls
...省略一堆strace ls的输出..., 后面是第一个strace的输出
% time     seconds  usecs/call     calls    errors syscall
------ ----------- ----------- --------- --------- -----------------
 35.77    0.004851           6       759         2 wait4
 15.66    0.002123           5       373           write
 14.86    0.002015           2       754         1 ptrace
  5.60    0.000760           7       104           mmap
  5.21    0.000707           9        75        19 openat
  5.14    0.000697         232         3           clone
  4.25    0.000576           8        72           mprotect
  3.95    0.000536           5       100           process_vm_readv
  2.93    0.000397           3       104           read
  1.62    0.000219           3        63           close
  1.39    0.000188           3        55           fstat
  1.19    0.000161           2        59           lseek
  0.45    0.000061          61         1           socket
  0.32    0.000043           7         6         3 stat
  0.27    0.000037           3        12           futex
  0.21    0.000028          14         2           statfs
  0.20    0.000027          13         2           munmap
  0.18    0.000025           8         3           pipe
  0.15    0.000021           1        11           rt_sigaction
  0.13    0.000017           4         4           brk
  0.13    0.000017           5         3         2 access
  0.10    0.000014           4         3           kill
  0.10    0.000013           2         6           fcntl
  0.03    0.000004           4         1           getgid
  0.03    0.000004           2         2         1 arch_prctl
  0.02    0.000003           1         2           rt_sigprocmask
  0.02    0.000003           3         1           getpid
  0.02    0.000003           3         1           uname
  0.02    0.000003           3         1           set_tid_address
  0.02    0.000003           3         1           prlimit64
  0.01    0.000002           2         1           getuid
  0.01    0.000002           2         1           set_robust_list
  0.00    0.000000           0         1           execve
------ ----------- ----------- --------- --------- -----------------
100.00    0.013560           5      2586        28 total

第一个strace检测到第二个strace调用了ptrace函数几百次。

strace一个神奇的工具!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

深山老宅

鸡蛋不错的话,要不要激励下母鸡

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值