Linux程序要求内核为它们做一些事情。strace命令显示这些系统调用。您可以使用它们来了解程序是如何工作的,有时为什么不工作。
尽管计算机程序可能很聪明,但它们不能为自己做任何事情。他们需要请求为他们执行某些功能。这些请求进入Linux内核。通常,程序调用一个库或其他软件接口,然后库向内核发出相应的请求,称为系统调用。
能够看到程序所做的系统调用以及响应是什么,可以帮助您理解您感兴趣的程序或您编写的程序的内部工作。斯特拉斯就是这样做的。它可以帮助解决问题并查找瓶颈。
这与使用gdb之类的工具调试应用程序不同。调试程序允许您在程序运行时调查其内部操作。它允许您逐步检查程序的逻辑并检查内存和变量值。相比之下,strace所做的是在程序运行时捕获系统调用信息。当跟踪程序终止时,strace将系统调用信息列出到终端窗口。
系统调用提供了各种低级功能,例如对文件的读写操作、终止进程等等。syscalls手册页上有数百个系统调用的列表。
相关:使用GDB调试:入门
如果你的电脑上还没有安装strace,你可以很容易地安装它。
在Ubuntu上,使用以下命令:
sudo apt install strace在Fedora上,键入以下命令:
sudo dnf install strace命令是,曼加罗:
sudo pacman -Sy strace我们将用一个小程序来演示strace。它做的不多:它打开一个文件并向其中写入一行文本,并且在检查时没有任何错误。这只是一个快速的破解,这样我们就可以使用strace了。
#include <stdio.h> int main(int argc, char argv[]) { // file handle FILE *fileGeek; // open a file called "strace_demo.txt", or create it fileGeek = fopen("strace_demo.txt", "w"); // write some text to the file fprintf(fileGeek, "Write this to the file" ); // close the file fclose(fileGeek); // exit from program return (0); } // end of main我们将其保存到一个名为“file io.c”的文件中,并用gcc将其编译成一个名为stex的可执行文件,命名为“strace example”
gcc -o stex file-io.c我们将从命令行调用strace,并将新可执行文件的名称作为要跟踪的进程传递给它。我们可以很容易地跟踪任何Linux命令或任何其他二进制可执行文件。我们使用这个小程序有两个原因。
第一个原因是strace很冗长。可以有很多输出。当你在愤怒中使用strace时,这是很好的,但一开始它可能会让你不知所措。我们的小程序的strace输出有限。第二个原因是我们的程序功能有限,而且源代码简单明了。这使得识别输出的哪些部分引用程序内部工作的不同部分变得更容易。
strace ./stex我们可以清楚地看到write系统调用将文本“write this to the file”发送到打开的文件和exit\ group系统调用。这将终止应用程序中的所有线程,并将返回值发送回shell。
即使用我们简单的演示程序,也有相当多的输出。我们可以使用-e(表达式)选项。我们将传入希望看到的系统调用的名称。
strace -e write ./stexAdvertisement
您可以通过将多个系统调用添加为逗号分隔的列表来报告它们。不要在系统调用列表中包含任何空格。
strace -e close,write ./stex过滤输出的好处也是过滤输出的问题。你看到了你要求看到的东西,但你看不到其他任何东西。其他一些输出可能比你要求看的东西对你更有用。
有时,捕获所有内容并搜索和滚动整个结果集更方便。这样,你就不会意外地排除任何重要的东西。o(output)选项允许您将strace会话的输出发送到文本文件。
strace -o trace-output.txt ./stex然后可以使用less命令滚动列表并按名称搜索系统调用或任何其他内容。
less trace-output.txt现在可以使用less的所有搜索功能来调查输出。
相关:如何在Linux上使用less命令
您可以向输出添加几个不同的时间戳。-r(相对时间戳)选项添加时间戳,以显示每个连续系统调用的开始之间的时间差。注意,这些时间值将包括在上一个系统调用中花费的时间以及程序在下一个系统调用之前正在做的任何其他事情。
strace -r ./stexAdvertisement
时间戳显示在每行输出的开始处。
要查看每个系统调用花费的时间量,请使用-T(syscall times)选项。这显示了在每个系统调用中花费的时间。
strace -T ./stex持续时间显示在每个系统调用行的末尾。
要查看调用每个系统调用的时间,请使用-tt(绝对时间戳)选项。这显示了“挂钟”时间,分辨率为微秒。
strace -tt ./stex时间显示在每行的开头。
如果要跟踪的进程已经在运行,您仍然可以将strace附加到它。为此,您需要知道进程ID。您可以使用ps和grep来查找该进程。Firefox正在运行。为了找出firefox进程的ID,我们可以使用ps并通过grep进行管道传输。
ps -e | grep firefoxAdvertisement
我们可以看到进程ID是8483。我们将使用-p(进程ID)选项来告诉strace要附加到哪个进程。请注意,您需要使用sudo:
sudo strace -p 8483您将看到一个通知,说明strace已将自己连接到进程,然后系统跟踪调用将像往常一样显示在终端窗口中。
c(仅摘要)选项使strace打印报告。它生成一个表,其中包含有关被跟踪程序进行的系统调用的信息。
strace -c ./stex这些列是:
这些值将显示快速执行和终止的琐碎程序的零。对于那些比演示应用程序更有意义的程序,显示了现实世界的价值观。
strace输出可以显示正在进行的系统调用、重复进行的系统调用以及在内核端代码中花费的执行时间。这是很好的信息。通常,当您试图理解代码内部的情况时,很容易忘记二进制文件几乎是不间断地与内核交互以执行其许多功能。
通过使用strace,您可以看到完整的图像。
Canonical对Ubuntu有着雄心勃勃的计划。Linux人类发行版一开始只是一个稍微有点主题的GNOME体验。从那时起,Canonical创建了自己的Unity桌面界面。现在它正在开发一个完全不基于GNOME的新版本。另外,Ubuntu将拥有自己的显示服务器,...
...机。它是独立的,设置简单,使用方便。我们将向您展示如何开始。 管理多个linux服务器 如果您要监视多台Linux计算机或服务器,您将面临一个挑战。这是特别真实的,如果其中一些是运行无头系统没有显示器连接。例如,您...
...好的程序会让僵尸进程潜伏在Linux计算机中。了解僵尸是如何产生的,以及如何让它们最终安息。 进程状态如何在linux上工作 当然,Linux必须跟踪计算机上运行的所有应用程序和守护进程。其中一种方法是维护进程表。这是内...
...的内容上,而不是和一组晦涩难懂的宏作斗争。 相关:如何使用Linux的man命令:隐藏的秘密和基础 潘多克前往救援 pandoc程序读取标记文件并生成大约40种不同标记语言和文档格式的新文件,包括手册页。它完全改变了手册页的...
...把它点燃看看! 相关:您应该知道的37条重要的Linux命令 如何打开手册 要使用man,请在命令行中键入man,后跟空格和Linux命令。man打开Linux手册的“手册页”,其中描述了该命令,当然,如果它能找到它的话。 让我们输入以下内...
...和术语。按less中的正斜杠“/”键启动搜索功能。 相关:如何在Linux上使用less命令 不再需要sudo 如果希望避免每次使用dmesg时都必须使用sudo,可以使用以下命令。但是,请注意:它允许任何拥有您的计算机用户帐户的人使用dmesg...