第2章 开发板板载系统应用、库、工具、使用
**注意:**此章内容讲解开发板系统内应用/库工具等的使用介绍,仅在需要时参考学习 不需要逐一验证测试。
2.1 图形库和图形应用
2.1.1 Qt GUI
运行环境
- 支持的INIT服务: systemV
- 支持的开发板系统: Buildroot版本系统
-
-
-
- 开发板Qt GUI简述
-
-
-
QT是一种跨平台C++图形用户界面应用程序开发框架。它既可以开发GUI程序,也可用于开发非GUI程序,比如控制台工具和服务器。Qt是面向对象的框架,使用特殊的代码生成扩展以及一些宏,Qt很容易扩展,并且允许真正地组件编程。
开发板会在出厂的时候烧写带有Qt运行时库的系统,并且提供了一个丰富的HMI演示系统,具体内容可以查看《MEasy HMI2.0 开发手册》。
在嵌入式Linux系统上,可以使用多个平台插件:EGLFS,LinuxFB,DirectFB或Wayland。但是,这些插件的可用性取决于实际硬件平台的特性 以及Qt的配置方式。EGLFS是许多主板上的默认插件。如果不合适,请使用QT_QPA_PLATFORM环境变量来请求另一个插件。另外,对于快速测试,请使用-platform具有相同语法的命令行参数。例如在用户控制台下,可以使用如下命令进行配置。
export QT_QPA_PLATFORM=linuxfb
/usr/bin/mxapp2 --plugin tslib:/dev/input/event1
或者使用-platform linuxfb 指令平台插件,如下:
export QT_QPA_PLATFORM=linuxfb
/usr/bin/mxapp2 --plugin tslib:/dev/input/event1 -platform linuxfb
对于包含GPU的现代嵌入式Linux设备,推荐使用EGLFS插件,使用GPU进行渲染。如果嵌入式Linux设备不包含GPU或者不支持OpenGL ES测试,则只能指定linuxfb平台插件通过CPU进行软件的渲染了。
注意:从Qt 5.0开始,Qt不再具有自己的窗口系统(QWS)实现,因此不再支持Qt早期版本上使用的 -qws参数。
-
-
-
-
- 运行linuxfb platform qtgui
-
-
-
使用系统默认的qt脚本来启动gui应用,开机自启动脚本存放在 /etc/init.d/目录下文件名为S99myirhmi2 如下命令执行/etc/init.d/S99myirhmi2 start表示启动qt gui程序。
[root@100ask:~]# /etc/init.d/S99myirhmi2 start

如需关闭qt gui可以执行/etc/init.d/S99myirhmi2 stop 命令,来关闭qt gui。
如果您不想使用系统自带的GUI,可以执行以下命令:
mv /etc/init.d/S99myirhmi2 ~
mv /etc/init.d/*lvgl* ~
reboot
2.1.2 显示测试fb-test-app
fb-test-app是一套用来测试显示设备色彩性能的一套应用程序,使用此程序是之前需要先关闭默认系统自带的GUI程序,开发板终端上执行:
mv /etc/init.d/S99myirhmi2 ~
mv /etc/init.d/*lvgl* ~
reboot
- 使用fb-test来测试当前显示设备输出的RGB颜色,并获取到一些基本参数。

- 使用fb-test-perf对lcd显 示进行性能分析, fb-test-perf <fbnum> <logfile>使用其中<fbnum>表示 显示设备的设备节点<logfile>表示保存log文件的文件名,如下示例我们对 /dev/fb0设备节点进行性能分析并把log文件保存在 log.txt内。


- 使用 fb-test-rect 来对此显示屏做渲染测试。


2.1.3 开机动画psplash
PSplash是一个用户空间图形开机启动屏幕的应用程序,主要用于支持16bpp或32bpp帧缓冲区的嵌入式Linux设备。它有很少的依赖项(只是libc),支持基本的图像和文本以及句柄回传。它的显示可以通过基本的源更改来配置。
还包括一个“终端”命令实用程序,用于将信息发送到psplash,例如显示启动进度信息,psplash包含 psplash-write psplash两个应用程序,其中psplash用来启动显示,psplash-write用来写入进度提示信息退出程序等。
- 终端执行psplash -n& 命令来启动psplash 并将其在后台运行。
[root@100ask:~]# psplash -n &


- 使用psplash-write “ MSG <文本消息> “在系统进度条上方显示文本消息。
[root@100ask:~]# psplash-write "MSG 100ask Starting ......"

- 使用psplash-write “ PROGRESS <进度值> “在进度条哪里显示当前的运行进度,如下所示,显示当前启动进度为 30%。
[root@100ask:~]# psplash-write "PROGRESS 30"
![]()

- 使用psplash-write “ QUIT “来关闭psplash 如下所示终端执行psplash-write " QUIT " 命令即可关闭psplash程序,可以继续执行其它GUI应用,如qt.
[root@100ask:~]# psplash-write " QUIT "

2.2 压缩与解压缩应用
本节主要测试系统的解压缩工具。压缩是可以把多个文件压缩成一个压缩包可以把多个文件压缩成一个压缩包,方便进行文件的传输。而解压可以把经过压缩的压缩文件还原成原始大小方便使用。本节将在文件系统以tar、gzip、gunzip等工具为例进行说明。
2.2.1 Tar压缩解压缩工具
-
-
-
-
- tar工具
-
-
-
现在我们在Linux中使用的 tar 工具,它不仅可以对文件打包,还可以对其进行压缩,查看,添加以及解压等一系列操作。这里是将打包操作。
语法格式
输入以下命令查看tar语法格式:
[root@100ask:~]# tar --help
Usage: tar [OPTION...] [FILE]...
GNU 'tar' saves many files together into a single tape or disk archive, and can
restore individual files from the archive.
Examples:
tar -cf archive.tar foo bar # Create archive.tar from files foo and bar.
tar -tvf archive.tar # List all files in archive.tar verbosely.
tar -xf archive.tar # Extract all files from archive.tar.
详细参数说明如下:
- c :建立一个压缩文件的參数指令(create 的意思);
- x :解开一个压缩文件的參数指令!
- t :查看 tarfile 里面的文件!特别注意,在參数的下达中, c/x/t 仅能存在一个!不可同一时候存在!由于不可能同一时候压缩与解压缩。
- z :是否同一时候具有 gzip 的属性?亦即是否须要用 gzip 压缩?
- j :是否同一时候具有 bzip2 的属性?亦即是否须要用 bzip2 压缩?
- -v :压缩的过程中显示文件!这个经常使用,但不建议用在背景运行过程!
- -f :使用档名,请留意,在 f 之后要马上接档名,不要再加參数!比如使用『tar -zcvfP tfile sfile』就是错误的写法,要写成『 tar -zcvPf tfile sfile』才对。
- -p :使用原文件的原来属性(属性不会根据使用者而变)
- -P :能够使用绝对路径来压缩!
- -N :比后面接的日期(yyyy/mm/dd)还要新的才会被打包进新建的文件里!
- --exclude FILE:在压缩的过程中,不要将 FILE 打包!
-
-
-
- 使用tar压缩
-
-
-
新建test.txt文件,并输入以下命令将文件打包成.gz格式:
[root@100ask:~]# tar -czf test.tar.gz test.txt
[root@100ask:~]# ls
test.txt
所以上面加 z 參数,则以 .tar.gz 或 .tgz 来代表 gzip 压缩过的 tar file 。
-
-
-
-
- 使用tar解压
-
-
-
把打包成tar.gz格式文件解压
[root@100ask:~]# tar -xvf test.tar.gz
test.txt
[root@100ask:~]# ls
test.c
2.2.2 压缩工具
gzip是在Linux系统中经常使用的一个对文件进行压缩和解压缩的命令,既方便又好用。
-
-
-
-
- 语法格式
-
-
-
在开发板终端输入以下命令查看gzip语法:
[root@100ask:~]# gzip --help
BusyBox v1.31.1 () multi-call binary.
Usage: gzip [-cfkdt] [FILE]...
-
-
-
-
- gzip把文件压缩
-
-
-
[root@100ask:~]# gzip test.txt
[root@100ask:~]# ls
test.c
-
-
-
-
- 用gunzip工具解压
-
-
-
用gunzip把文件解压,示例如下:
[root@100ask:~]# gunzip test.txt.gz
[root@100ask:~]# ls
test.c
2.3 调试、性能分析、基准测试应用
2.3.1 远程调试gdbserver
在板子上需满足有gcc编译器、gdb调试器等,但一般对于嵌入式系统来说,在资源有限情况下,gcc编译器及环境一般是在安装X86 Linux主机上。那 么此时,编译环境与程序运行环境就分开了,如果此时要进行GDB调试时,就需要借助ARM Linux上的GDBServer实现了。即通过网络建立server与client,进而实现gdb调试。
GDB Client及GDBServer就构成了ARM Linux的调试环境,其框架如下图所示:

-
-
-
-
- 准备程序
-
-
-
我们使用C语言程序来演示一下,其代码内容如下:
/*********************************测试程序**********************************/
#include <stdio.h>
//实现a+b
int add(int a, int b)
{
return a + b;
}
//实现a-b
int sub(int a, int b)
{
return a - b;
}
int main()
{
printf(" 2 + 3 = %d\n", add(2, 3));
printf(" 2 - 3 = %d\n", sub(2, 3));
return 1;
}
接下来,使用命令将其编译,-g表示可以调试,命令如下:
book@100ask:~$ arm-buildroot-linux-gnueabihf-gcc test.c -g -o test
-
-
-
-
- 启动gdb
-
-
-
根据前面小节的准备,现需将编译生成的<test>程序拷贝到开发板上,拷贝的方法有很多种,100ASK提供的虚拟机已经配置了NFS、SSH等多种服务,这里以ssh为例,将<test>程序拷贝开发板上,已知开发板IP为192.168.0.8,使用命令:
book@100ask:~$ scp test root@192.168.0.8:/root
将<test>程序拷贝到开发板/root目录下,效果如下所示:

切换到开发板终端,并通过gdbserver在指定端口<12345>建立服务,同时阻塞进行监听,如下所示:
[root@100ask:~]# gdbserver :12345 test

-
-
-
-
- 主机连接gdbserver
-
-
-
根据前面第1、2小节的准备,并将编译生成的<test>程序拷贝到开发板/mnt目录下,并成功在开发板的12345端口建立了监听服务,此时,需启动主机的gdb程序以进行连接,命令如下所示:
book@100ask:~$ arm-buildroot-linux-gnueabihf-gdb test
此时,当出现以下提示时:
Reading symbols from test...done.
输入命令:
target remote 192.168.0.8:12345
表示连接至远程GDB服务192.168.0.8,端口12345;回车之后,可以看到主机已经成功连接上了,如下图所示:

-
-
-
-
- 开始调试
-
-
-
经过第3小节的操作,我们已经使得主机与开发板通过网络实现远程GDB连接,此时,可以在主机中输入gdb调试指令以实现远程调试,以一下的几个命令进行演示,如下所示分别b 设置断点 info breakpoint 查看设置断点 c 执行程序:

-
-
-
-
- 附录 GDB常用命令参考
-
-
-
表 2‑1 GDB常用命令
| 命令 | 简写形式 | 说明 |
|---|---|---|
| backtrace | bt、where | 显示 backtrace |
| break | 设置断点 | |
| continue | c、cont | 继续运行 |
| delete | d | 删除断点 |
| finish | 运行到函数结束 | |
| info breakpoints | 显示断点信息 | |
| next | n | 执行下一行 |
| p | 显示表达式 | |
| run | r | 运行程序 |
| step | s | 一次执行一行,包括函数内部 |
| x | 显示内存内容 | |
| until | u | 执行到指定行 |
| directory | dir | 插入目录 |
| disable | dis | 禁用断点 |
| down | do | 在当前调用的栈帧中选择要显示的栈帧 |
| edit | e | 编辑文件或函数 |
| frame | f | 选择要显示的栈帧 |
| forward-search | fo | 向前搜索 |
| generate-core-file | gcore | 生成内核转储 |
| help | h | 显示帮助一览 |
| info | i | 显示信息 |
| list | l | 显示函数或行 |
| nexti | ni | 执行下一行(以汇编代码为单位) |
| print-object | po | 显示目标信息 |
| sharedlibrary | share | 加载共享库的符号 |
| setpi | si | 执 行下一行 |
2.3.2 查看系统调用strace
Linux中的strace命令可以帮助您查看程序系统调用和信号。
-
-
-
-
- 使用strace查看ls命令的系统调用过程。
-
-
-
[root@100ask:/]# strace ls
execve("/bin/ls", ["ls"], 0x7ea3fdc0 /* 16 vars */) = 0
brk(NULL) = 0x951000
uname({sysname="Linux", nodename="100ask", ...}) = 0
mmap2(NULL, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x76f47000
access("/etc/ld.so.preload", R_OK) = -1 ENOENT (No such file or directory)
openat(AT_FDCWD, "/etc/ld.so.cache", O_RDONLY|O_LARGEFILE|O_CLOEXEC) = -1 ENOENT (No such file or directory)
openat(AT_FDCWD, "/lib/tls/v7l/neon/vfp/libresolv.so.2", O_RDONLY|O_LARGEFILE|O_CLOEXEC) = -1 ENOENT (No such file or directory)
stat64("/lib/tls/v7l/neon/vfp", 0x7e9a41f8) = -1 ENOENT (No such file or directory)
openat(AT_FDCWD, "/lib/tls/v7l/neon/libresolv.so.2", O_RDONLY|O_LARGEFILE|O_CLOEXEC) = -1 ENOENT (No such file or directory)
stat64("/lib/tls/v7l/neon", 0x7e9a41f8) = -1 ENOENT (No such file or directory)
openat(AT_FDCWD, "/lib/tls/v7l/vfp/libresolv.so.2", O_RDONLY|O_LARGEFILE|O_CLOEXEC) = -1 ENOENT (No such file or directory)
stat64("/lib/tls/v7l/vfp", 0x7e9a41f8) = -1 ENOENT (No such file or directory)
openat(AT_FDCWD, "/lib/tls/v7l/libresolv.so.2", O_RDONLY|O_LARGEFILE|O_CLOEXEC) = -1 ENOENT (No such file or directory)
stat64("/lib/tls/v7l", 0x7e9a41f8) = -1 ENOENT (No such file or directory)
openat(AT_FDCWD, "/lib/tls/neon/vfp/libresolv.so.2", O_RDONLY|O_LARGEFILE|O_CLOEXEC) = -1 ENOENT (No such file or directory)
stat64("/lib/tls/neon/vfp", 0x7e9a41f8) = -1 ENOENT (No such file or directory)
openat(AT_FDCWD, "/lib/tls/neon/libresolv.so.2", O_RDONLY|O_LARGEFILE|O_CLOEXEC) = -1 ENOENT (No such file or directory)
stat64("/lib/tls/neon", 0x7e9a41f8) = -1 ENOENT (No such file or directory)
openat(AT_FDCWD, "/lib/tls/vfp/libresolv.so.2", O_RDONLY|O_LARGEFILE|O_CLOEXEC) = -1 ENOENT (No such file or directory)
stat64("/lib/tls/vfp", 0x7e9a41f8) = -1 ENOENT (No such file or directory)
openat(AT_FDCWD, "/lib/tls/libresolv.so.2", O_RDONLY|O_LARGEFILE|O_CLOEXEC) = -1 ENOENT (No such file or directory)
stat64("/lib/tls", 0x7e9a41f8) = -1 ENOENT (No such file or directory)
openat(AT_FDCWD, "/lib/v7l/neon/vfp/libresolv.so.2", O_RDONLY|O_LARGEFILE|O_CLOEXEC) = -1 ENOENT (No such file or directory)
stat64("/lib/v7l/neon/vfp", 0x7e9a41f8) = -1 ENOENT (No such file or directory)
openat(AT_FDCWD, "/lib/v7l/neon/libresolv.so.2", O_RDONLY|O_LARGEFILE|O_CLOEXEC) = -1 ENOENT (No such file or directory)
stat64("/lib/v7l/neon", 0x7e9a41f8) = -1 ENOENT (No such file or directory)
openat(AT_FDCWD, "/lib/v7l/vfp/libresolv.so.2", O_RDONLY|O_LARGEFILE|O_CLOEXEC) = -1 ENOENT (No such file or directory)
stat64("/lib/v7l/vfp", 0x7e9a41f8) = -1 ENOENT (No such file or directory)
openat(AT_FDCWD, "/lib/v7l/libresolv.so.2", O_RDONLY|O_LARGEFILE|O_CLOEXEC) = -1 ENOENT (No such file or directory)
stat64("/lib/v7l", 0x7e9a41f8) = -1 ENOENT (No such file or directory)
openat(AT_FDCWD, "/lib/neon/vfp/libresolv.so.2", O_RDONLY|O_LARGEFILE|O_CLOEXEC) = -1 ENOENT (No such file or directory)
stat64("/lib/neon/vfp", 0x7e9a41f8) = -1 ENOENT (No such file or directory)
openat(AT_FDCWD, "/lib/neon/libresolv.so.2", O_RDONLY|O_LARGEFILE|O_CLOEXEC) = -1 ENOENT (No such file or directory)
stat64("/lib/neon", 0x7e9a41f8) = -1 ENOENT (No such file or directory)
openat(AT_FDCWD, "/lib/vfp/libresolv.so.2", O_RDONLY|O_LARGEFILE|O_CLOEXEC) = -1 ENOENT (No such file or directory)
stat64("/lib/vfp", 0x7e9a41f8) = -1 ENOENT (No such file or directory)
openat(AT_FDCWD, "/lib/libresolv.so.2", O_RDONLY|O_LARGEFILE|O_CLOEXEC) = 3
read(3, "\177ELF\1\1\1\0\0\0\0\0\0\0\0\0\3\0(\0\1\0\0\0\260#\0\0004\0\0\0"..., 512) = 512
fstat64(3, {st_mode=S_IFREG|0755, st_size=67220, ...}) = 0
mmap2(NULL, 141216, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x76ef6000
mprotect(0x76f06000, 61440, PROT_NONE) = 0
mmap2(0x76f15000, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0xf000) = 0x76f15000
mmap2(0x76f17000, 6048, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0x76f17000
close(3) = 0
openat(AT_FDCWD, "/lib/libc.so.6", O_RDONLY|O_LARGEFILE|O_CLOEXEC) = 3
read(3, "\177ELF\1\1\1\0\0\0\0\0\0\0\0\0\3\0(\0\1\0\0\0\234w\1\0004\0\0\0"..., 512) = 512
fstat64(3, {st_mode=S_IFREG|0755, st_size=1241860, ...}) = 0
mmap2(NULL, 1311420, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x76db5000
mprotect(0x76ee0000, 65536, PROT_NONE) = 0
mmap2(0x76ef0000, 12288, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x12b000) = 0x76ef0000
mmap2(0x76ef3000, 8892, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0x76ef3000
close(3) = 0
set_tls(0x76f48060) = 0
mprotect(0x76ef0000, 8192, PROT_READ) = 0
mprotect(0x76f15000, 4096, PROT_READ) = 0
mprotect(0xd4000, 4096, PROT_READ) = 0
mprotect(0x76f49000, 4096, PROT_READ) = 0
getuid32() = 0
gettimeofday({tv_sec=6434, tv_usec=363916}, NULL) = 0
ioctl(0, TIOCGWINSZ, {ws_row=84, ws_col=137, ws_xpixel=0, ws_ypixel=0}) = 0
ioctl(1, TCGETS, {B115200 opost isig icanon echo ...}) = 0
ioctl(1, TCGETS, {B115200 opost isig icanon echo ...}) = 0
brk(NULL) = 0x951000
brk(0x972000) = 0x972000
stat64(".", {st_mode=S_IFDIR|0755, st_size=4096, ...}) = 0
openat(AT_FDCWD, ".", O_RDONLY|O_NONBLOCK|O_LARGEFILE|O_CLOEXEC|O_DIRECTORY) = 3
fstat64(3, {st_mode=S_IFDIR|0755, st_size=4096, ...}) = 0
getdents64(3, /* 24 entries */, 32768) = 632
lstat64("./mnt", {st_mode=S_IFDIR|0755, st_size=4096, ...}) = 0
lstat64("./media", {st_mode=S_IFDIR|0755, st_size=4096, ...}) = 0
lstat64("./boot", {st_mode=S_IFDIR|0755, st_size=4096, ...}) = 0
lstat64("./lib", {st_mode=S_IFDIR|0755, st_size=4096, ...}) = 0
lstat64("./run", {st_mode=S_IFDIR|0755, st_size=340, ...}) = 0
lstat64("./bin", {st_mode=S_IFDIR|0755, st_size=4096, ...}) = 0
lstat64("./lib32", {st_mode=S_IFLNK|0777, st_size=3, ...}) = 0
lstat64("./root", {st_mode=S_IFDIR|0700, st_size=4096, ...}) = 0
lstat64("./sys", {st_mode=S_IFDIR|0555, st_size=0, ...}) = 0
lstat64("./linuxrc", {st_mode=S_IFLNK|0777, st_size=11, ...}) = 0
lstat64("./etc", {st_mode=S_IFDIR|0755, st_size=4096, ...}) = 0
lstat64("./tmp", {st_mode=S_IFDIR|S_ISVTX|0777, st_size=260, ...}) = 0
lstat64("./lost+found", {st_mode=S_IFDIR|0700, st_size=16384, ...}) = 0
lstat64("./usr", {st_mode=S_IFDIR|0755, st_size=4096, ...}) = 0
lstat64("./proc", {st_mode=S_IFDIR|0555, st_size=0, ...}) = 0
lstat64("./var", {st_mode=S_IFDIR|0755, st_size=4096, ...}) = 0
lstat64("./sbin", {st_mode=S_IFDIR|0755, st_size=4096, ...}) = 0
lstat64("./opt", {st_mode=S_IFDIR|0755, st_size=4096, ...}) = 0
lstat64("./dev", {st_mode=S_IFDIR|0755, st_size=3440, ...}) = 0
getdents64(3, /* 0 entries */, 32768) = 0
close(3) = 0
fstat64(1, {st_mode=S_IFCHR|0600, st_rdev=makedev(0xcf, 0x10), ...}) = 0
ioctl(1, TCGETS, {B115200 opost isig icanon echo ...}) = 0
write(1, "\33[1;34mbin\33[m \33[1;34mdev"..., 212bin dev lib linuxrc media opt root sbin tmp var
) = 212
write(1, "\33[1;34mboot\33[m \33[1;34metc"..., 190boot etc lib32 lost+found mnt proc run sys usr
) = 190
exit_group(0) = ?
+++ exited with 0 +++
-
-
-
-
- 使用-i命令打印调用过程的栈指针地址。
-
-
-
[root@100ask:/]# strace -i ls
[76ee0b1c] execve("/bin/ls", ["ls"], 0x7eee0db4 /* 16 vars */) = 0
[76f3d788] brk(NULL) = 0x14c2000
[76f3ed2c] uname({sysname="Linux", nodename="100ask", ...}) = 0
[76f3ec44] mmap2(NULL, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x76f53000
[76f3e80c] access("/etc/ld.so.preload", R_OK) = -1 ENOENT (No such file or directory)
[76f3ea10] openat(AT_FDCWD, "/etc/ld.so.cache", O_RDONLY|O_LARGEFILE|O_CLOEXEC) = -1 ENOENT (No such file or directory)
[76f3ea10] openat(AT_FDCWD, "/lib/tls/v7l/neon/vfp/libresolv.so.2", O_RDONLY|O_LARGEFILE|O_CLOEXEC) = -1 ENOENT (No such file or directory)
[76f3e640] stat64("/lib/tls/v7l/neon/vfp", 0x7ebb41f8) = -1 ENOENT (No such file or directory)
[76f3ea10] openat(AT_FDCWD, "/lib/tls/v7l/neon/libresolv.so.2", O_RDONLY|O_LARGEFILE|O_CLOEXEC) = -1 ENOENT (No such file or directory)
[76f3e640] stat64("/lib/tls/v7l/neon", 0x7ebb41f8) = -1 ENOENT (No such file or directory)
[76f3ea10] openat(AT_FDCWD, "/lib/tls/v7l/vfp/libresolv.so.2", O_RDONLY|O_LARGEFILE|O_CLOEXEC) = -1 ENOENT (No such file or directory)
[76f3e640] stat64("/lib/tls/v7l/vfp", 0x7ebb41f8) = -1 ENOENT (No such file or directory)
[76f3ea10] openat(AT_FDCWD, "/lib/tls/v7l/libresolv.so.2", O_RDONLY|O_LARGEFILE|O_CLOEXEC) = -1 ENOENT (No such file or directory)
[76f3e640] stat64("/lib/tls/v7l", 0x7ebb41f8) = -1 ENOENT (No such file or directory)
[76f3ea10] openat(AT_FDCWD, "/lib/tls/neon/vfp/libresolv.so.2", O_RDONLY|O_LARGEFILE|O_CLOEXEC) = -1 ENOENT (No such file or directory)
[76f3e640] stat64("/lib/tls/neon/vfp", 0x7ebb41f8) = -1 ENOENT (No such file or directory)
[76f3ea10] openat(AT_FDCWD, "/lib/tls/neon/libresolv.so.2", O_RDONLY|O_LARGEFILE|O_CLOEXEC) = -1 ENOENT (No such file or directory)
[76f3e640] stat64("/lib/tls/neon", 0x7ebb41f8) = -1 ENOENT (No such file or directory)
[76f3ea10] openat(AT_FDCWD, "/lib/tls/vfp/libresolv.so.2", O_RDONLY|O_LARGEFILE|O_CLOEXEC) = -1 ENOENT (No such file or directory)
[76f3e640] stat64("/lib/tls/vfp", 0x7ebb41f8) = -1 ENOENT (No such file or directory)
[76f3ea10] openat(AT_FDCWD, "/lib/tls/libresolv.so.2", O_RDONLY|O_LARGEFILE|O_CLOEXEC) = -1 ENOENT (No such file or directory)
[76f3e640] stat64("/lib/tls", 0x7ebb41f8) = -1 ENOENT (No such file or directory)
[76f3ea10] openat(AT_FDCWD, "/lib/v7l/neon/vfp/libresolv.so.2", O_RDONLY|O_LARGEFILE|O_CLOEXEC) = -1 ENOENT (No such file or directory)
[76f3e640] stat64("/lib/v7l/neon/vfp", 0x7ebb41f8) = -1 ENOENT (No such file or directory)
[76f3ea10] openat(AT_FDCWD, "/lib/v7l/neon/libresolv.so.2", O_RDONLY|O_LARGEFILE|O_CLOEXEC) = -1 ENOENT (No such file or directory)
[76f3e640] stat64("/lib/v7l/neon", 0x7ebb41f8) = -1 ENOENT (No such file or directory)
[76f3ea10] openat(AT_FDCWD, "/lib/v7l/vfp/libresolv.so.2", O_RDONLY|O_LARGEFILE|O_CLOEXEC) = -1 ENOENT (No such file or directory)
[76f3e640] stat64("/lib/v7l/vfp", 0x7ebb41f8) = -1 ENOENT (No such file or directory)
[76f3ea10] openat(AT_FDCWD, "/lib/v7l/libresolv.so.2", O_RDONLY|O_LARGEFILE|O_CLOEXEC) = -1 ENOENT (No such file or directory)
[76f3e640] stat64("/lib/v7l", 0x7ebb41f8) = -1 ENOENT (No such file or directory)
[76f3ea10] openat(AT_FDCWD, "/lib/neon/vfp/libresolv.so.2", O_RDONLY|O_LARGEFILE|O_CLOEXEC) = -1 ENOENT (No such file or directory)
[76f3e640] stat64("/lib/neon/vfp", 0x7ebb41f8) = -1 ENOENT (No such file or directory)
[76f3ea10] openat(AT_FDCWD, "/lib/neon/libresolv.so.2", O_RDONLY|O_LARGEFILE|O_CLOEXEC) = -1 ENOENT (No such file or directory)
[76f3e640] stat64("/lib/neon", 0x7ebb41f8) = -1 ENOENT (No such file or directory)
[76f3ea10] openat(AT_FDCWD, "/lib/vfp/libresolv.so.2", O_RDONLY|O_LARGEFILE|O_CLOEXEC) = -1 ENOENT (No such file or directory)
[76f3e640] stat64("/lib/vfp", 0x7ebb41f8) = -1 ENOENT (No such file or directory)
[76f3ea10] openat(AT_FDCWD, "/lib/libresolv.so.2", O_RDONLY|O_LARGEFILE|O_CLOEXEC) = 3
[76f3eaf0] read(3, "\177ELF\1\1\1\0\0\0\0\0\0\0\0\0\3\0(\0\1\0\0\0\260#\0\0004\0\0\0"..., 512) = 512
[76f3e684] fstat64(3, {st_mode=S_IFREG|0755, st_size=67220, ...}) = 0
[76f3ec44] mmap2(NULL, 141216, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x76f02000
[76f3ecec] mprotect(0x76f12000, 61440, PROT_NONE) = 0
[76f3ec44] mmap2(0x76f21000, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0xf000) = 0x76f21000
[76f3ec44] mmap2(0x76f23000, 6048, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0x76f23000
[76f3e848] close(3) = 0
[76f3ea10] openat(AT_FDCWD, "/lib/libc.so.6", O_RDONLY|O_LARGEFILE|O_CLOEXEC) = 3
[76f3eaf0] read(3, "\177ELF\1\1\1\0\0\0\0\0\0\0\0\0\3\0(\0\1\0\0\0\234w\1\0004\0\0\0"..., 512) = 512
[76f3e684] fstat64(3, {st_mode=S_IFREG|0755, st_size=1241860, ...}) = 0
[76f3ec44] mmap2(NULL, 1311420, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x76dc1000
[76f3ecec] mprotect(0x76eec000, 65536, PROT_NONE) = 0
[76f3ec44] mmap2(0x76efc000, 12288, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x12b000) = 0x76efc000
[76f3ec44] mmap2(0x76eff000, 8892, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0x76eff000
[76f3e848] close(3) = 0
[76f25b88] set_tls(0x76f54060) = 0
[76f3ecec] mprotect(0x76efc000, 8192, PROT_READ) = 0
[76f3ecec] mprotect(0x76f21000, 4096, PROT_READ) = 0
[76f3ecec] mprotect(0xd4000, 4096, PROT_READ) = 0
[76f3ecec] mprotect(0x76f55000, 4096, PROT_READ) = 0
[76e5e29c] getuid32() = 0
[76e4c8e0] gettimeofday({tv_sec=6476, tv_usec=495220}, NULL) = 0
[76e8a46c] ioctl(0, TIOCGWINSZ, {ws_row=84, ws_col=137, ws_xpixel=0, ws_ypixel=0}) = 0
[76e89ab4] ioctl(1, TCGETS, {B115200 opost isig icanon echo ...}) = 0
[76e89ab4] ioctl(1, TCGETS, {B115200 opost isig icanon echo ...}) = 0
[76e8a2f4] brk(NULL) = 0x14c2000
[76e8a2f4] brk(0x14e3000) = 0x14e3000
[76e80cb4] stat64(".", {st_mode=S_IFDIR|0755, st_size=4096, ...}) = 0
[76e893dc] openat(AT_FDCWD, ".", O_RDONLY|O_NONBLOCK|O_LARGEFILE|O_CLOEXEC|O_DIRECTORY) = 3
[76e80cfc] fstat64(3, {st_mode=S_IFDIR|0755, st_size=4096, ...}) = 0
[76e58c30] getdents64(3, /* 24 entries */, 32768) = 632
[76e80d44] lstat64("./mnt", {st_mode=S_IFDIR|0755, st_size=4096, ...}) = 0
[76e80d44] lstat64("./media", {st_mode=S_IFDIR|0755, st_size=4096, ...}) = 0
[76e80d44] lstat64("./boot", {st_mode=S_IFDIR|0755, st_size=4096, ...}) = 0
[76e80d44] lstat64("./lib", {st_mode=S_IFDIR|0755, st_size=4096, ...}) = 0
[76e80d44] lstat64("./run", {st_mode=S_IFDIR|0755, st_size=340, ...}) = 0
[76e80d44] lstat64("./bin", {st_mode=S_IFDIR|0755, st_size=4096, ...}) = 0
[76e80d44] lstat64("./lib32", {st_mode=S_IFLNK|0777, st_size=3, ...}) = 0
[76e80d44] lstat64("./root", {st_mode=S_IFDIR|0700, st_size=4096, ...}) = 0
[76e80d44] lstat64("./sys", {st_mode=S_IFDIR|0555, st_size=0, ...}) = 0
[76e80d44] lstat64("./linuxrc", {st_mode=S_IFLNK|0777, st_size=11, ...}) = 0
[76e80d44] lstat64("./etc", {st_mode=S_IFDIR|0755, st_size=4096, ...}) = 0
[76e80d44] lstat64("./tmp", {st_mode=S_IFDIR|S_ISVTX|0777, st_size=260, ...}) = 0
[76e80d44] lstat64("./lost+found", {st_mode=S_IFDIR|0700, st_size=16384, ...}) = 0
[76e80d44] lstat64("./usr", {st_mode=S_IFDIR|0755, st_size=4096, ...}) = 0
[76e80d44] lstat64("./proc", {st_mode=S_IFDIR|0555, st_size=0, ...}) = 0
[76e80d44] lstat64("./var", {st_mode=S_IFDIR|0755, st_size=4096, ...}) = 0
[76e80d44] lstat64("./sbin", {st_mode=S_IFDIR|0755, st_size=4096, ...}) = 0
[76e80d44] lstat64("./opt", {st_mode=S_IFDIR|0755, st_size=4096, ...}) = 0
[76e80d44] lstat64("./dev", {st_mode=S_IFDIR|0755, st_size=3440, ...}) = 0
[76e58c30] getdents64(3, /* 0 entries */, 32768) = 0
[76e89254] close(3) = 0
[76e80cfc] fstat64(1, {st_mode=S_IFCHR|0600, st_rdev=makedev(0xcf, 0x10), ...}) = 0
[76e89ab4] ioctl(1, TCGETS, {B115200 opost isig icanon echo ...}) = 0
[76e819b8] write(1, "\33[1;34mbin\33[m \33[1;34mdev"..., 212bin dev lib linuxrc media opt root sbin tmp var
) = 212
[76e819b8] write(1, "\33[1;34mboot\33[m \33[1;34metc"..., 190boot etc lib32 lost+found mnt proc run sys usr
) = 190
[76e5dac4] exit_group(0) = ?
[????????] +++ exited with 0 +++
-
-
-
-
- 使用 -t命令使每一行都以系统时间开始显示。
-
-
-
[root@100ask:/]# strace -t ls
01:48:35 execve("/bin/ls", ["ls"], 0x7e8f6db4 /* 16 vars */) = 0
01:48:35 brk(NULL) = 0x16de000
01:48:35 uname({sysname="Linux", nodename="100ask", ...}) = 0
01:48:35 mmap2(NULL, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x76f75000
01:48:35 access("/etc/ld.so.preload", R_OK) = -1 ENOENT (No such file or directory)
01:48:35 openat(AT_FDCWD, "/etc/ld.so.cache", O_RDONLY|O_LARGEFILE|O_CLOEXEC) = -1 ENOENT (No such file or directory)
01:48:35 openat(AT_FDCWD, "/lib/tls/v7l/neon/vfp/libresolv.so.2", O_RDONLY|O_LARGEFILE|O_CLOEXEC) = -1 ENOENT (No such file or directory)
01:48:35 stat64("/lib/tls/v7l/neon/vfp", 0x7eac31f8) = -1 ENOENT (No such file or directory)
01:48:35 openat(AT_FDCWD, "/lib/tls/v7l/neon/libresolv.so.2", O_RDONLY|O_LARGEFILE|O_CLOEXEC) = -1 ENOENT (No such file or directory)
01:48:35 stat64("/lib/tls/v7l/neon", 0x7eac31f8) = -1 ENOENT (No such file or directory)
01:48:35 openat(AT_FDCWD, "/lib/tls/v7l/vfp/libresolv.so.2", O_RDONLY|O_LARGEFILE|O_CLOEXEC) = -1 ENOENT (No such file or directory)
01:48:35 stat64("/lib/tls/v7l/vfp", 0x7eac31f8) = -1 ENOENT (No such file or directory)
01:48:35 openat(AT_FDCWD, "/lib/tls/v7l/libresolv.so.2", O_RDONLY|O_LARGEFILE|O_CLOEXEC) = -1 ENOENT (No such file or directory)
01:48:35 stat64("/lib/tls/v7l", 0x7eac31f8) = -1 ENOENT (No such file or directory)
01:48:35 openat(AT_FDCWD, "/lib/tls/neon/vfp/libresolv.so.2", O_RDONLY|O_LARGEFILE|O_CLOEXEC) = -1 ENOENT (No such file or directory)
01:48:35 stat64("/lib/tls/neon/vfp", 0x7eac31f8) = -1 ENOENT (No such file or directory)
01:48:35 openat(AT_FDCWD, "/lib/tls/neon/libresolv.so.2", O_RDONLY|O_LARGEFILE|O_CLOEXEC) = -1 ENOENT (No such file or directory)
01:48:35 stat64("/lib/tls/neon", 0x7eac31f8) = -1 ENOENT (No such file or directory)
01:48:35 openat(AT_FDCWD, "/lib/tls/vfp/libresolv.so.2", O_RDONLY|O_LARGEFILE|O_CLOEXEC) = -1 ENOENT (No such file or directory)
01:48:35 stat64("/lib/tls/vfp", 0x7eac31f8) = -1 ENOENT (No such file or directory)
01:48:35 openat(AT_FDCWD, "/lib/tls/libresolv.so.2", O_RDONLY|O_LARGEFILE|O_CLOEXEC) = -1 ENOENT (No such file or directory)
01:48:35 stat64("/lib/tls", 0x7eac31f8) = -1 ENOENT (No such file or directory)
01:48:35 openat(AT_FDCWD, "/lib/v7l/neon/vfp/libresolv.so.2", O_RDONLY|O_LARGEFILE|O_CLOEXEC) = -1 ENOENT (No such file or directory)
01:48:35 stat64("/lib/v7l/neon/vfp", 0x7eac31f8) = -1 ENOENT (No such file or directory)
01:48:35 openat(AT_FDCWD, "/lib/v7l/neon/libresolv.so.2", O_RDONLY|O_LARGEFILE|O_CLOEXEC) = -1 ENOENT (No such file or directory)
01:48:35 stat64("/lib/v7l/neon", 0x7eac31f8) = -1 ENOENT (No such file or directory)
01:48:35 openat(AT_FDCWD, "/lib/v7l/vfp/libresolv.so.2", O_RDONLY|O_LARGEFILE|O_CLOEXEC) = -1 ENOENT (No such file or directory)
01:48:35 stat64("/lib/v7l/vfp", 0x7eac31f8) = -1 ENOENT (No such file or directory)
01:48:35 openat(AT_FDCWD, "/lib/v7l/libresolv.so.2", O_RDONLY|O_LARGEFILE|O_CLOEXEC) = -1 ENOENT (No such file or directory)
01:48:35 stat64("/lib/v7l", 0x7eac31f8) = -1 ENOENT (No such file or directory)
01:48:35 openat(AT_FDCWD, "/lib/neon/vfp/libresolv.so.2", O_RDONLY|O_LARGEFILE|O_CLOEXEC) = -1 ENOENT (No such file or directory)
01:48:35 stat64("/lib/neon/vfp", 0x7eac31f8) = -1 ENOENT (No such file or directory)
01:48:35 openat(AT_FDCWD, "/lib/neon/libresolv.so.2", O_RDONLY|O_LARGEFILE|O_CLOEXEC) = -1 ENOENT (No such file or directory)
01:48:35 stat64("/lib/neon", 0x7eac31f8) = -1 ENOENT (No such file or directory)
01:48:35 openat(AT_FDCWD, "/lib/vfp/libresolv.so.2", O_RDONLY|O_LARGEFILE|O_CLOEXEC) = -1 ENOENT (No such file or directory)
01:48:35 stat64("/lib/vfp", 0x7eac31f8) = -1 ENOENT (No such file or directory)
01:48:35 openat(AT_FDCWD, "/lib/libresolv.so.2", O_RDONLY|O_LARGEFILE|O_CLOEXEC) = 3
01:48:35 read(3, "\177ELF\1\1\1\0\0\0\0\0\0\0\0\0\3\0(\0\1\0\0\0\260#\0\0004\0\0\0"..., 512) = 512
01:48:35 fstat64(3, {st_mode=S_IFREG|0755, st_size=67220, ...}) = 0
01:48:35 mmap2(NULL, 141216, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x76f24000
01:48:35 mprotect(0x76f34000, 61440, PROT_NONE) = 0
01:48:35 mmap2(0x76f43000, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0xf000) = 0x76f43000
01:48:35 mmap2(0x76f45000, 6048, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0x76f45000
01:48:35 close(3) = 0
01:48:35 openat(AT_FDCWD, "/lib/libc.so.6", O_RDONLY|O_LARGEFILE|O_CLOEXEC) = 3
01:48:35 read(3, "\177ELF\1\1\1\0\0\0\0\0\0\0\0\0\3\0(\0\1\0\0\0\234w\1\0004\0\0\0"..., 512) = 512
01:48:35 fstat64(3, {st_mode=S_IFREG|0755, st_size=1241860, ...}) = 0
01:48:35 mmap2(NULL, 1311420, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x76de3000
01:48:35 mprotect(0x76f0e000, 65536, PROT_NONE) = 0
01:48:35 mmap2(0x76f1e000, 12288, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x12b000) = 0x76f1e000
01:48:35 mmap2(0x76f21000, 8892, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0x76f21000
01:48:35 close(3) = 0
01:48:35 set_tls(0x76f76060) = 0
01:48:35 mprotect(0x76f1e000, 8192, PROT_READ) = 0
01:48:35 mprotect(0x76f43000, 4096, PROT_READ) = 0
01:48:35 mprotect(0xd4000, 4096, PROT_READ) = 0
01:48:35 mprotect(0x76f77000, 4096, PROT_READ) = 0
01:48:35 getuid32() = 0
01:48:35 gettimeofday({tv_sec=6515, tv_usec=490797}, NULL) = 0
01:48:35 ioctl(0, TIOCGWINSZ, {ws_row=84, ws_col=137, ws_xpixel=0, ws_ypixel=0}) = 0
01:48:35 ioctl(1, TCGETS, {B115200 opost isig icanon echo ...}) = 0
01:48:35 ioctl(1, TCGETS, {B115200 opost isig icanon echo ...}) = 0
01:48:35 brk(NULL) = 0x16de000
01:48:35 brk(0x16ff000) = 0x16ff000
01:48:35 stat64(".", {st_mode=S_IFDIR|0755, st_size=4096, ...}) = 0
01:48:35 openat(AT_FDCWD, ".", O_RDONLY|O_NONBLOCK|O_LARGEFILE|O_CLOEXEC|O_DIRECTORY) = 3
01:48:35 fstat64(3, {st_mode=S_IFDIR|0755, st_size=4096, ...}) = 0
01:48:35 getdents64(3, /* 24 entries */, 32768) = 632
01:48:35 lstat64("./mnt", {st_mode=S_IFDIR|0755, st_size=4096, ...}) = 0
01:48:35 lstat64("./media", {st_mode=S_IFDIR|0755, st_size=4096, ...}) = 0
01:48:35 lstat64("./boot", {st_mode=S_IFDIR|0755, st_size=4096, ...}) = 0
01:48:35 lstat64("./lib", {st_mode=S_IFDIR|0755, st_size=4096, ...}) = 0
01:48:35 lstat64("./run", {st_mode=S_IFDIR|0755, st_size=340, ...}) = 0
01:48:35 lstat64("./bin", {st_mode=S_IFDIR|0755, st_size=4096, ...}) = 0
01:48:35 lstat64("./lib32", {st_mode=S_IFLNK|0777, st_size=3, ...}) = 0
01:48:35 lstat64("./root", {st_mode=S_IFDIR|0700, st_size=4096, ...}) = 0
01:48:35 lstat64("./sys", {st_mode=S_IFDIR|0555, st_size=0, ...}) = 0
01:48:35 lstat64("./linuxrc", {st_mode=S_IFLNK|0777, st_size=11, ...}) = 0
01:48:35 lstat64("./etc", {st_mode=S_IFDIR|0755, st_size=4096, ...}) = 0
01:48:35 lstat64("./tmp", {st_mode=S_IFDIR|S_ISVTX|0777, st_size=260, ...}) = 0
01:48:35 lstat64("./lost+found", {st_mode=S_IFDIR|0700, st_size=16384, ...}) = 0
01:48:35 lstat64("./usr", {st_mode=S_IFDIR|0755, st_size=4096, ...}) = 0
01:48:35 lstat64("./proc", {st_mode=S_IFDIR|0555, st_size=0, ...}) = 0
01:48:35 lstat64("./var", {st_mode=S_IFDIR|0755, st_size=4096, ...}) = 0
01:48:35 lstat64("./sbin", {st_mode=S_IFDIR|0755, st_size=4096, ...}) = 0
01:48:35 lstat64("./opt", {st_mode=S_IFDIR|0755, st_size=4096, ...}) = 0
01:48:35 lstat64("./dev", {st_mode=S_IFDIR|0755, st_size=3440, ...}) = 0
01:48:35 getdents64(3, /* 0 entries */, 32768) = 0
01:48:35 close(3) = 0
01:48:35 fstat64(1, {st_mode=S_IFCHR|0600, st_rdev=makedev(0xcf, 0x10), ...}) = 0
01:48:35 ioctl(1, TCGETS, {B115200 opost isig icanon echo ...}) = 0
01:48:35 write(1, "\33[1;34mbin\33[m \33[1;34mdev"..., 212bin dev lib linuxrc media opt root sbin tmp var
) = 212
01:48:35 write(1, "\33[1;34mboot\33[m \33[1;34metc"..., 190boot etc lib32 lost+found mnt proc run sys usr
) = 190
01:48:35 exit_group(0) = ?
01:48:35 +++ exited with 0 +++
-
-
-
-
- 使用-T参数来显示ls命令系统调用花费的时间,时间显示在每行最后的<>内。
-
-
-
[root@100ask:/]# strace -T ls
execve("/bin/ls", ["ls"], 0x7ee5edb4 /* 16 vars */) = 0 <0.003837>
brk(NULL) = 0x1e82000 <0.000196>
uname({sysname="Linux", nodename="100ask", ...}) = 0 <0.000207>
mmap2(NULL, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x76f18000 <0.000257>
access("/etc/ld.so.preload", R_OK) = -1 ENOENT (No such file or directory) <0.000326>
openat(AT_FDCWD, "/etc/ld.so.cache", O_RDONLY|O_LARGEFILE|O_CLOEXEC) = -1 ENOENT (No such file or directory) <0.000321>
openat(AT_FDCWD, "/lib/tls/v7l/neon/vfp/libresolv.so.2", O_RDONLY|O_LARGEFILE|O_CLOEXEC) = -1 ENOENT (No such file or directory) <0.000289>
stat64("/lib/tls/v7l/neon/vfp", 0x7e8e31f8) = -1 ENOENT (No such file or directory) <0.000257>
openat(AT_FDCWD, "/lib/tls/v7l/neon/libresolv.so.2", O_RDONLY|O_LARGEFILE|O_CLOEXEC) = -1 ENOENT (No such file or directory) <0.000263>
stat64("/lib/tls/v7l/neon", 0x7e8e31f8) = -1 ENOENT (No such file or directory) <0.000313>
openat(AT_FDCWD, "/lib/tls/v7l/vfp/libresolv.so.2", O_RDONLY|O_LARGEFILE|O_CLOEXEC) = -1 ENOENT (No such file or directory) <0.000260>
stat64("/lib/tls/v7l/vfp", 0x7e8e31f8) = -1 ENOENT (No such file or directory) <0.000220>
openat(AT_FDCWD, "/lib/tls/v7l/libresolv.so.2", O_RDONLY|O_LARGEFILE|O_CLOEXEC) = -1 ENOENT (No such file or directory) <0.000324>
stat64("/lib/tls/v7l", 0x7e8e31f8) = -1 ENOENT (No such file or directory) <0.000216>
openat(AT_FDCWD, "/lib/tls/neon/vfp/libresolv.so.2", O_RDONLY|O_LARGEFILE|O_CLOEXEC) = -1 ENOENT (No such file or directory) <0.000256>
stat64("/lib/tls/neon/vfp", 0x7e8e31f8) = -1 ENOENT (No such file or directory) <0.000217>
openat(AT_FDCWD, "/lib/tls/neon/libresolv.so.2", O_RDONLY|O_LARGEFILE|O_CLOEXEC) = -1 ENOENT (No such file or directory) <0.000258>
stat64("/lib/tls/neon", 0x7e8e31f8) = -1 ENOENT (No such file or directory) <0.000212>
openat(AT_FDCWD, "/lib/tls/vfp/libresolv.so.2", O_RDONLY|O_LARGEFILE|O_CLOEXEC) = -1 ENOENT (No such file or directory) <0.000249>
stat64("/lib/tls/vfp", 0x7e8e31f8) = -1 ENOENT (No such file or directory) <0.000122>
openat(AT_FDCWD, "/lib/tls/libresolv.so.2", O_RDONLY|O_LARGEFILE|O_CLOEXEC) = -1 ENOENT (No such file or directory) <0.000135>
stat64("/lib/tls", 0x7e8e31f8) = -1 ENOENT (No such file or directory) <0.000099>
openat(AT_FDCWD, "/lib/v7l/neon/vfp/libresolv.so.2", O_RDONLY|O_LARGEFILE|O_CLOEXEC) = -1 ENOENT (No such file or directory) <0.000118>
stat64("/lib/v7l/neon/vfp", 0x7e8e31f8) = -1 ENOENT (No such file or directory) <0.000091>
openat(AT_FDCWD, "/lib/v7l/neon/libresolv.so.2", O_RDONLY|O_LARGEFILE|O_CLOEXEC) = -1 ENOENT (No such file or directory) <0.000115>
stat64("/lib/v7l/neon", 0x7e8e31f8) = -1 ENOENT (No such file or directory) <0.000088>
openat(AT_FDCWD, "/lib/v7l/vfp/libresolv.so.2", O_RDONLY|O_LARGEFILE|O_CLOEXEC) = -1 ENOENT (No such file or directory) <0.000103>
stat64("/lib/v7l/vfp", 0x7e8e31f8) = -1 ENOENT (No such file or directory) <0.000094>
openat(AT_FDCWD, "/lib/v7l/libresolv.so.2", O_RDONLY|O_LARGEFILE|O_CLOEXEC) = -1 ENOENT (No such file or directory) <0.000104>
stat64("/lib/v7l", 0x7e8e31f8) = -1 ENOENT (No such file or directory) <0.000086>
openat(AT_FDCWD, "/lib/neon/vfp/libresolv.so.2", O_RDONLY|O_LARGEFILE|O_CLOEXEC) = -1 ENOENT (No such file or directory) <0.000106>
stat64("/lib/neon/vfp", 0x7e8e31f8) = -1 ENOENT (No such file or directory) <0.000133>
openat(AT_FDCWD, "/lib/neon/libresolv.so.2", O_RDONLY|O_LARGEFILE|O_CLOEXEC) = -1 ENOENT (No such file or directory) <0.000104>
stat64("/lib/neon", 0x7e8e31f8) = -1 ENOENT (No such file or directory) <0.000093>
openat(AT_FDCWD, "/lib/vfp/libresolv.so.2", O_RDONLY|O_LARGEFILE|O_CLOEXEC) = -1 ENOENT (No such file or directory) <0.000101>
stat64("/lib/vfp", 0x7e8e31f8) = -1 ENOENT (No such file or directory) <0.000083>
openat(AT_FDCWD, "/lib/libresolv.so.2", O_RDONLY|O_LARGEFILE|O_CLOEXEC) = 3 <0.000222>
read(3, "\177ELF\1\1\1\0\0\0\0\0\0\0\0\0\3\0(\0\1\0\0\0\260#\0\0004\0\0\0"..., 512) = 512 <0.000129>
fstat64(3, {st_mode=S_IFREG|0755, st_size=67220, ...}) = 0 <0.000071>
mmap2(NULL, 141216, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x76ec7000 <0.000232>
mprotect(0x76ed7000, 61440, PROT_NONE) = 0 <0.000117>
mmap2(0x76ee6000, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0xf000) = 0x76ee6000 <0.000182>
mmap2(0x76ee8000, 6048, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0x76ee8000 <0.000403>
close(3) = 0 <0.000193>
openat(AT_FDCWD, "/lib/libc.so.6", O_RDONLY|O_LARGEFILE|O_CLOEXEC) = 3 <0.000550>
read(3, "\177ELF\1\1\1\0\0\0\0\0\0\0\0\0\3\0(\0\1\0\0\0\234w\1\0004\0\0\0"..., 512) = 512 <0.000292>
fstat64(3, {st_mode=S_IFREG|0755, st_size=1241860, ...}) = 0 <0.000188>
mmap2(NULL, 1311420, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x76d86000 <0.000249>
mprotect(0x76eb1000, 65536, PROT_NONE) = 0 <0.000264>
mmap2(0x76ec1000, 12288, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x12b000) = 0x76ec1000 <0.000369>
mmap2(0x76ec4000, 8892, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0x76ec4000 <0.000328>
close(3) = 0 <0.000187>
set_tls(0x76f19060) = 0 <0.000190>
mprotect(0x76ec1000, 8192, PROT_READ) = 0 <0.000296>
mprotect(0x76ee6000, 4096, PROT_READ) = 0 <0.000255>
mprotect(0xd4000, 4096, PROT_READ) = 0 <0.000236>
mprotect(0x76f1a000, 4096, PROT_READ) = 0 <0.000243>
getuid32() = 0 <0.000428>
gettimeofday({tv_sec=6556, tv_usec=889804}, NULL) = 0 <0.000211>
ioctl(0, TIOCGWINSZ, {ws_row=84, ws_col=137, ws_xpixel=0, ws_ypixel=0}) = 0 <0.000216>
ioctl(1, TCGETS, {B115200 opost isig icanon echo ...}) = 0 <0.000308>
ioctl(1, TCGETS, {B115200 opost isig icanon echo ...}) = 0 <0.000223>
brk(NULL) = 0x1e82000 <0.000171>
brk(0x1ea3000) = 0x1ea3000 <0.000212>
stat64(".", {st_mode=S_IFDIR|0755, st_size=4096, ...}) = 0 <0.000267>
openat(AT_FDCWD, ".", O_RDONLY|O_NONBLOCK|O_LARGEFILE|O_CLOEXEC|O_DIRECTORY) = 3 <0.000285>
fstat64(3, {st_mode=S_IFDIR|0755, st_size=4096, ...}) = 0 <0.000186>
getdents64(3, /* 24 entries */, 32768) = 632 <0.000504>
lstat64("./mnt", {st_mode=S_IFDIR|0755, st_size=4096, ...}) = 0 <0.000283>
lstat64("./media", {st_mode=S_IFDIR|0755, st_size=4096, ...}) = 0 <0.000249>
lstat64("./boot", {st_mode=S_IFDIR|0755, st_size=4096, ...}) = 0 <0.000251>
lstat64("./lib", {st_mode=S_IFDIR|0755, st_size=4096, ...}) = 0 <0.000247>
lstat64("./run", {st_mode=S_IFDIR|0755, st_size=340, ...}) = 0 <0.000248>
lstat64("./bin", {st_mode=S_IFDIR|0755, st_size=4096, ...}) = 0 <0.000240>
lstat64("./lib32", {st_mode=S_IFLNK|0777, st_size=3, ...}) = 0 <0.000246>
lstat64("./root", {st_mode=S_IFDIR|0700, st_size=4096, ...}) = 0 <0.000232>
lstat64("./sys", {st_mode=S_IFDIR|0555, st_size=0, ...}) = 0 <0.000248>
lstat64("./linuxrc", {st_mode=S_IFLNK|0777, st_size=11, ...}) = 0 <0.000260>
lstat64("./etc", {st_mode=S_IFDIR|0755, st_size=4096, ...}) = 0 <0.000248>
lstat64("./tmp", {st_mode=S_IFDIR|S_ISVTX|0777, st_size=260, ...}) = 0 <0.000247>
lstat64("./lost+found", {st_mode=S_IFDIR|0700, st_size=16384, ...}) = 0 <0.000244>
lstat64("./usr", {st_mode=S_IFDIR|0755, st_size=4096, ...}) = 0 <0.000237>
lstat64("./proc", {st_mode=S_IFDIR|0555, st_size=0, ...}) = 0 <0.000244>
lstat64("./var", {st_mode=S_IFDIR|0755, st_size=4096, ...}) = 0 <0.000238>
lstat64("./sbin", {st_mode=S_IFDIR|0755, st_size=4096, ...}) = 0 <0.000295>
lstat64("./opt", {st_mode=S_IFDIR|0755, st_size=4096, ...}) = 0 <0.000228>
lstat64("./dev", {st_mode=S_IFDIR|0755, st_size=3440, ...}) = 0 <0.000232>
getdents64(3, /* 0 entries */, 32768) = 0 <0.000259>
close(3) = 0 <0.000255>
fstat64(1, {st_mode=S_IFCHR|0600, st_rdev=makedev(0xcf, 0x10), ...}) = 0 <0.000184>
ioctl(1, TCGETS, {B115200 opost isig icanon echo ...}) = 0 <0.000267>
write(1, "\33[1;34mbin\33[m \33[1;34mdev"..., 212bin dev lib linuxrc media opt root sbin tmp var
) = 212 <0.000272>
write(1, "\33[1;34mboot\33[m \33[1;34metc"..., 190boot etc lib32 lost+found mnt proc run sys usr
) = 190 <0.000252>
exit_group(0) = ?
+++ exited with 0 +++
-
-
-
-
- 使用-c参数可以使strace打印摘要而不是通常的输出。
-
-
-
[root@100ask:/]# strace -c ls
bin dev lib linuxrc media opt root sbin tmp var
boot etc lib32 lost+found mnt proc run sys usr
% time seconds usecs/call calls errors syscall
------ ----------- ----------- --------- --------- ----------------
0.00 0.000000 0 2 read
0.00 0.000000 0 2 write
0.00 0.000000 0 3 close
0.00 0.000000 0 1 execve
0.00 0.000000 0 1 1 access
0.00 0.000000 0 3 brk
0.00 0.000000 0 4 ioctl
0.00 0.000000 0 1 gettimeofday
0.00 0.000000 0 1 uname
0.00 0.000000 0 6 mprotect
0.00 0.000000 0 7 mmap2
0.00 0.000000 0 16 15 stat64
0.00 0.000000 0 19 lstat64
0.00 0.000000 0 4 fstat64
0.00 0.000000 0 1 getuid32
0.00 0.000000 0 2 getdents64
0.00 0.000000 0 19 16 openat
0.00 0.000000 0 1 set_tls
------ ----------- ----------- --------- --------- ----------------
100.00 0.000000 93 32 total
-
-
-
-
- 使用-o 文件名参数可以使strace打印信息输出到某个文件内。
-
-
-
[root@100ask:/]# strace -o log.txt -t ls
2.4 开发工具应用
2.4.1 Grep
Linux grep 命令用于查找文件里符合条件的字符串。
grep 指令用于查找内容包含指定的范本样式的文件,如果发现某文件的内容符合所指定的范本样式,预设 grep 指令会把含有范本样式的那一列显示出来。若不指定任何文件名称,或是所给予的文件名为 -,则 grep 指令会从标准输入设备读取数据。
-
-
-
-
- 语法
-
-
-
grep [-abcEFGhHilLnqrsvVwxy][-A<显示列数>][-B<显示列数>][-C<显示列数>][-d<进行动作>][-e<范本样式>][-f<范本文件>][--help][范本样式][文件或目录...]
参数:
-
- -a 或 --text : 不要忽略二进制的数据。
- -A<显示行数> 或 --after-context=<显示行数> : 除了显示符合范本样式的那一列之外,并显示该行之后的内容。
- -b 或 --byte-offset : 在显示符合样式的那一行之前,标示出该行第一个字符的编号。
- -B<显示行数> 或 --before-context=<显示行数> : 除了显示符合样式的那一行之外,并显示该行之前的内容。
- -c 或 --count : 计算符合样式的列数。
- -C<显示行数> 或 --context=<显示行数>或-<显示行数> : 除了显示符合样式的那一行之外,并显示该行之前后的内容。
- -d <动作> 或 --directories=<动作> : 当指定要查找的是目录而非文件时,必须使用这项参数,否则grep指令将回报信息并停止动作。
- -e<范本样式> 或 --regexp=<范本样式> : 指定字符串做为查找文件内容的样式。
- -E 或 --extended-regexp : 将样式为延伸的正则表达式来使用。
- -f<规则文件> 或 --file=<规则文件> : 指定规则文件,其内容含有一个或多个规则样式,让grep查找符合规则条件的文件内容,格式为每行一个规则样式。
- -F 或 --fixed-regexp : 将样式视为固定字符串的列表。
- -G 或 --basic-regexp : 将样式视为普通的表示法来使用。
- -h 或 --no-filename : 在显示符合样式的那一行之前,不标示该行所属的文件名称。
- -H 或 --with-filename : 在显示符合样式的那一行之前,表示该行所属的文件名称。
- -i 或 --ignore-case : 忽略字符大小写的差别。
- -l 或 --file-with-matches : 列出文件内容符合指定的样式的文件名称。
- -L 或 --files-without-match : 列出文件内容不符合指定的样式的文件名称。
- -n 或 --line-number : 在显示符合样式的那一行之前,标示出该行的列数编号。
- -o 或 --only-matching : 只显示匹配PATTERN 部分。
- -q 或 --quiet或--silent : 不显示任何信息。
- -r 或 --recursive : 此参数的效果和指定"-d recurse"参数相同。
- -s 或 --no-messages : 不显示错误信息。
- -v 或 --invert-match : 显示不包含匹配文本的所有行。
- -V 或 --version : 显示版本信息。
- -w 或 --word-regexp : 只显示全字符合的列。
- -x --line-regexp : 只显示全列符合的列。
- -y : 此参数的效果和指定"-i"参数相同。
-
-
- 示例
-
-
- 查找log文件内某个时间的所有记录
grep -n '2020-10-24 00:01:11' *.log
grep "被查找的字符串" 文件名
例子:在当前目录里第一级文件夹中寻找包含指定字符串的 .in 文件
grep "thermcontact" /.in
- 从文件内容查找与正则表达式匹配的行:
grep –e "正则表达式" 文件名
- 查找时不区分大小写:
grep –i "被查找的字符串" 文件名
- 查找匹配的行数:
grep -c "被查找的字符串" 文件名
- 从文件内容查找不匹配指定字符串的行:
grep –v "被查找的字符串" 文件名
- 从根目录开始查找所有扩展名为 .log 的文本文件,并找出包含 "ERROR" 的行:
find / -type f -name "*.log" | xargs grep "ERROR"
- 从当前目录开始查找所有扩展名为 .in 的文本文件,并找出包含 "thermcontact" 的行:
find . -name "*.in" | xargs grep "thermcontact"
参考阅读
https://www.gnu.org/software/grep/manual/grep.html
https://www.runoob.com/linux/linux-comm-grep.html
https://www.runoob.com/linux/linux-comm-grep.html
2.4.2 Gawk
awk 是一种编程语言,用于在linux/unix下对文本和数据进行处理。数据可以来自标准输入、一个或多个文件,或其它命令的输出(即管道)。它支持用户自定义函数和 动态正则表达式等先进功能,是linux/unix下的一个强大编程工具。它在命令行中使用,但更多是作为脚本来使用。
awk的处理文本和数据的方式是这 样的,它逐行扫描文件,从第一行到最后一行,寻找匹配的特定模式的行,并在这些行上进行你想要的操作。如果没有指定处理动作,则把匹配的行显示到标准输出 (屏幕),即默认处理动作是print;如果没有指定模式,则所有被操作所指定的行都被处理,即默认指定模式是全部。awk分别代表其作者姓氏的第一个字母。因为它的作者是三个人,分别是Alfred Aho、Brian Kernighan、Peter Weinberger。gawk是awk的GNU版本,它提供了Bell实验室和GNU的一些扩展。
像shell一样,awk也有好几种,常见的如awk、nawk、mawk、gawk,其中
- gawk:是 GNU Project 的awk解释器的开放源代码实现。
- 尽管早期的 GAWK 发行版是旧的 AWK 的替代程序,但不断地对其进行 了更新,以包含 NAWK 的特性;
目前,大家都比较倾向于使用awk和gawk,本文中要介绍的awk是以GUN的gawk为例。
gawk命令可用于:
-
- 逐行扫描文件。
- 将每个输入行拆分为字段。
- 比较输入行列/方向与样式。
- 在匹配的行上执行操作。
- 转换数据文件。
- 生成格式化的报告。
- 格式化输出行。
- 算术和字符串运算。
- 条件和循环。
-
-
- 语法格式
-
-
gawk [POSIX / GNU style options] -f progfile [--] file ...
gawk [POSIX / GNU style options] [--] 'program' file ...
一些重要的参数
- -f progfile, –file=progfile: 从文件program-file而不是从第一个命令行参数读取AWK程序源。可以使用多个-f(或–file)选 项。
- -F fs, –field-separator=fs: 它将FS用作输入字段分隔符(FS为预定义变量的值)。
- -v var=val, –assign=var=val: 在程序开始执行之前,将值val分配给变量var。
-
-
-
- 示例
-
-
-
- -F:它将FS用作输入字段分隔符(FS预定义变量的值)。
gawk -F: '{print $1}' /etc/passwd

- -f:从文件program-file而不是从第一个命令行参数读取AWK程序源。可以使用多个-f(或–file)选项。
gawk -F: -f test.txt /etc/passwd
参考资料
https://www.gnu.org/software/gawk/manual/gawk.html
https://www.geeksforgeeks.org/gawk-command-in-linux-with-examples/
2.4.3 Sed
sed是流编辑器。它可以对文件执行很多功能,例如搜索,查找和替换,插入或删除。流编辑器用于对输入流(文件或来自管道的输入)执行基本的文本转换。尽管在某种程度上类似于允许脚本化编辑的编辑器(例如ed),但 sed仅对输入进行一次传递即可工作,因此效率更高。但这是sed在管道中过滤文本的能力,这使其与其他类型的编辑器特别有区别。
-
-
-
-
- 语法
-
-
-
sed [-hnV][-e<script>][-f<script文件>][文本文件]
参数说明:
- -e<script>或--expression=<script> 以选项中指定的script来处理输入的文本文件。
- -f<script文件>或--file=<script文件> 以选项中指定的script文件来处理输入的文本文件。
- -h或--help 显示帮助。
- -n或--quiet或--silent 仅显示script处理后的结果。
- -V或--version 显示版本信息。
动作说明:
-
- a :新增, a 的后面可以接字串,而这些字串会在新的一行出现(目前的下一行)~
- c :取代, c 的后面可以接字串,这些字串可以取代 n1,n2 之间的行!
- d :删除,因为是删除啊,所以 d 后面通常不接任何咚咚;
- i :插入, i 的后面可以接字串,而这些字串会在新的一行出现(目前的上一行);
- p :打印,亦即将某个选择的数据印出。通常 p 会与参数 sed -n 一起运行~
- s :取代,可以直接进行取代的工作哩!通常这个 s 的动作可以 搭配正规表示法!例如 1,20s/old/new/g 就是啦!
-
-
- 示例
-
-
通常这样使用sed命令:
sed SCRIPT INPUTFILE...
例如,在文件input.txt中替换所有出现的“hello”为“word” ,并重定向输出到output.txt文件内。
sed 's/hello/world/' input.txt > output.txt
- 如果未指定INPUTFILE,或者如果 INPUTFILE 为 - ,sed过滤标准输入的内容。以下命令是等效的:
sed 's/hello/world/' input.txt > output.txt
sed 's/hello/world/' < input.txt > output.txt
cat input.txt | sed 's/hello/world/' - > output.txt
- sed将输出写入标准输出。用-可以就地编辑文件,而不是打印到标准输出。另请参见W和s///w命令,用于将输出写入其他文件。以下命令修改file.txt 并且不产生任何输出:
sed -i 's/hello/world/' file.txt
- 默认情况下,sed打印所有已处理的输入(诸如命令 修改/删除的输入除外)。用 -n 禁止输出,使用 p 显示特定的行。以下命令仅打印输入文件的第45行:
sed -n '45p' file.txt
- sed将多个输入文件视为一个长流。以下示例显示第一个文件的第一行(one.txt)和最后一个文件的最后一行(three.txt)。
sed -n '1p ; $p' one.txt two.txt three.txt
不管是-e 或 -f选项,sed使用第一个非选项参数作为脚本,然后使用以下非选项参数作为输入文件。
如果使用 -e命令或者 -f选项用于指定脚本,并非所有的非选项参数均作为输入文件。
选项 -e 和 -d可以组合,并且可以多次出现(在这种情况下,最终有效的脚本将是所有 单个脚本的串联)。
以下示例是等效的:
sed 's/hello/world/' input.txt > output.txt
sed -e 's/hello/world/' input.txt > output.txt
sed --expression='s/hello/world/' input.txt > output.txt
echo 's/hello/world/' > myscript.sed
sed -f myscript.sed input.txt > output.txt
sed --file=myscript.sed input.txt > output.txt
扩展参考
GNU官方SED命令手册:
https://www.gnu.org/software/sed/manual/html_node/sed-commands-list.html
https://www.gnu.org/software/sed/manual/sed.html
2.4.4 GNU Binutils工具集
GNU Binutils是二进制工具的集合。主要的是:
-
- ld -GNU链接器。
- as -GNU汇编器。
但它们还包括:
-
- addr2line-将地址转换为文件名和行号。
- ar-用于创建,修改和提取档案的实用程序。
- c ++ filt-过滤以解编码编码的C ++符号。
- dlltool-创建用于构建和使用DLL的文件。
- gold-一个新的,更快的,仅ELF的链接器,仍处于beta测试中。
- gprof-显示分析信息。
- nlmconv-将目标代码转换为NLM。
- nm-列出目标文件中的符号。
- objcopy-复制并转换目标文件。
- objdump-显示目标文件中的信息。
- ranlib-生成指向档案内容的索引。
- readelf-显示来自任何ELF格式对象文件的信息。
- size-列出的对象或归档文件的部分的尺寸。
- strings-列出文件中的可打印字符串。
- strip-丢弃的符号。
- windmc -Windows兼容的消息编译器。
- windres -Windows资源文件的编译器。
这些程序大多数使用BFD(二进制文件描述符库)进行低级操作。他们中的许多人还使用操作码库来汇编和反汇编机器指令。