记载一些高级命令
strace
这个命令是用来进行查看命令的系统调用的。
常用的参数
-c
告诉我们调用了那些系统函数,调用次数多少,消耗了多少时间等等,这些信息对我们分析一个程序来说是非常有用的。
-p
使得我们可以使用进程号追踪一个进程。
使用-t选项,可以在每行的输出之前添加时间戳。-tt选项可以展示微秒级别的时间戳。
1
| strace -e open cat dead.letter
|
strace命令的-e选项仅仅被用来展示特定的系统调用(例如,open,write等等)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| -e trace=set 只跟踪指定的系统调用,例如: -e trace=open,close,rean,write 表示只跟踪这四个系统调用,默认的为 set=all 。
-e trace=file 只跟踪有关文件操作的系统调用。
-e trace=process 只跟踪有关进程控制的系统调用。
-e trace=network 跟踪与网络有关的所有系统调用。
-e strace=signal 跟踪所有与信号有关的系统调用。
-e trace=ipc 跟踪所有与进程通讯有关的系统调用。
-e raw=set 将指定的系统调用的参数以十六进制显示。
-e signal=se t 指定跟踪的系统信号。默认为all(所有信号)。如 signal=!SIGIO 或者 signal=!io ,表示不跟踪 SIGIO 信号。
-e read=set 输出从指定文件中读出的数据。
-e write=set 输出写入到指定文件中的数据。
|
参考资料
https://doc.embedfire.com/linux/imx6/base/zh/latest/linux_debug/strace.html
ltrace
这个命令是用来查看命令的库函数调用的。
常用的参数用法
-S
是查看系统调用
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
| -a 对齐具体某个列的返回值。 -c 计算时间和调用,并在程序退出时打印摘要。 -C 解码低级别名称(内核级)为用户级名称。 -d 打印调试信息。 -e 改变跟踪的事件。 -f 跟踪子进程。 -h 打印帮助信息。 -i 打印指令指针,当库调用时。 -l 只打印某个库中的调用。 -L 不打印库调用。 -n, --indent=NR 对每个调用级别嵌套以NR个空格进行缩进输出。 -o, --output=file 把输出定向到文件。 -p PID 附着在值为PID的进程号上进行ltrace。 -r 打印相对时间戳。 -s STRLEN 设置打印的字符串最大长度。 -S 显示系统调用。 -t, -tt, -ttt 打印绝对时间戳。 -T 输出每个调用过程的时间开销。 -u USERNAME 使用某个用户id或组ID来运行命令。 -V, --version 打印版本信息,然后退出。
|
参考资料
https://www.cnblogs.com/machangwei-8/p/10388938.html
ldd
这个命令用来查看进程使用的动态链接库。ldd不是一个可执行程序,而只是一个shell脚本
常见的参数使用
查看所有信息
输出:
1 2 3 4 5 6
| /opt/app/todeav1/test$ldd test libstdc++.so.6 => /usr/lib64/libstdc++.so.6 (0x00000039a7e00000) libm.so.6 => /lib64/libm.so.6 (0x0000003996400000) libgcc_s.so.1 => /lib64/libgcc_s.so.1 (0x00000039a5600000) libc.so.6 => /lib64/libc.so.6 (0x0000003995800000) /lib64/ld-linux-x86-64.so.2 (0x0000003995400000)
|
解释:
1 2 3
| 第一列:程序需要依赖什么库 第二列: 系统提供的与程序需要的库所对应的库 第三列:库加载的开始地址
|
参考资料
https://linuxtools-rst.readthedocs.io/zh-cn/latest/tool/ldd.html