需求
查看一个可执行文件,执行后,调用了哪些函数,执行顺序如何。
1. 使用strace查看
1.1 基本操作
strace -h
# 先验证一下有没有安装,没有的话
yum install strace
# 不带参数查看返回内容
strace 你的可执行文件
不带任何参数使用strace
命令会返回非常多的内容
如果使用的是docker,那么很可能出现如下错误信息,参考1.2 docker注意解决
[root@567b3aed2b1c build]$ strace ./run_server
> strace: ptrace(PTRACE_TRACEME, ...): Operation not permitted
strace: PTRACE_SETOPTIONS: Operation not permitted
strace: detach: waitpid(371): No child processes
strace: Process 371 detached
# 这是在docker中,已经是超级用户了,所以不是用户权限的问题
下面分别尝试不同参数,观察一下strace的效果,也可以自己查看-help
的内容试试。
参考:
- 不同linux系统下,strace的安装:How To Use Strace On Linux
- linux 跟踪函数调用,跟踪程序在Linux下的执行的函数调用
- 9.11 strace:跟踪进程的系统调用 、ltrace:跟踪进程调用库函数
1.2 docker注意
提示不被允许,是因为docker的限制
[root@567b3aed2b1c build]$ strace ./run_server
> strace: ptrace(PTRACE_TRACEME, ...): Operation not permitted
strace: PTRACE_SETOPTIONS: Operation not permitted
strace: detach: waitpid(371): No child processes
strace: Process 371 detached
网上大部分的解决方案,都是在docker run
的时候进行设置,加入参数,所以业务可以继续在这个容器跑,可以再重新开一个容器,研究一下调用情况,弄完删除容器就好了。
例如:
$ docker run -itd --privileged --name anyq-trace -p 0.0.0.0:8876:8999 -p 0.0.0.0:8700:8900 anyq/base
# 加入--privileged参数,就可以使用strace了
$ docker exec -it anyq-trace /bin/bash
$ strace 要追踪的可执行文件
参考:
- docker run 中的privileged参数
- strace: ptrace(PTRACE_TRACEME, …): Operation not permitted
- docker strace ptrace 报错 Operation not permitted 解决方法
- The solution for enabling of ptrace and PTRACE_ATTACH in Docker Containers
- stack overflow:How to solve “ptrace operation not permitted” when trying to attach GDB to a process?
2. 使用ltrace查看
基本使用也是
ltrace 可执行文件
也会返回一大堆人都看不懂的东西。
这两个工具应该都不适合我。。
参考:
3. 其他工具
考虑搜索A program to trace execution of another program
参考:
- github项目-uftrace
- uftrace工具介绍
- 使用uftrace来debug应用程序
- A program to trace execution of another program
This functionality uis usually predicated on the
ptrace (man ptrace)
function under unixes. The userspace toolset depends. *BSD hasktrace
, linux hasstrace
, and solaris10 has a different method based ondtrace
. Older solaris and aix hastruss
, HP-UX 11+ usestusc
. - 7 Strace Examples to Debug the Execution of a Program in Linux
- man手册:ltrace(1) — Linux manual page
- Red Hat文档:CHAPTER 20. DEBUGGING A RUNNING APPLICATION