当然C/C++的最基本的调度工具当属gdb。此处讲解一下strace用法。
1、系统调用
如创建文件、进程和复制文件等操作系统提供的服务,需要应用程序和操作系统之间进行交互。但是,问题在于,应用程序不能直接访问linux内核。但是应用程序可以跳转到system_call的内核位置,内核会检查系统调用号,该号码会告知内核进程正在请求的是哪种服务。然后,内核查看系统调用表,找到所调用的内核函数入口地址,调用函数,然后返回到进程。
系统调用:操作系统在内核上的一些内建的函数,通过调用这些函数来完成一些系统级别的功能。系统调用提供了一种用户空间到内核空间的转换方法。-
系统调用的错误码:系统调用并不直接返回错误码,而是将错误码放入errnor的全局变量中。如果一个系统调用失败,可以读出errno的值来确定问题的所在。errno不同数值所代表的错误消息定义在<errno.h>中,可通过命令man 3 errno来查看。
2、strace
strace是一个通过跟踪系统调用来让开发者知道一个程序在后台所做事情的工具。
一个测试的小程序,取名为testStrace.c
#include<iostream>
using namespace std;
int main(){
int a;
cin>>a;
cout<<a<<endl;
return 0;
}
i、运行strace ./testStrace后的结果图如下,
可以看到,出现很多系统调用函数,如execv(装载被执行程序)/access(测试文件)/mmap(进行内存映射)/open(打开一个文件)/fstat(查看文件的状态)/mprotect/read等。
ii、统计系统调用,命令如,strace -c ./testStrace
iii、其他常用选项
参数-o用在将strace的结果输出到文件中。如,strace -o test.txt ./testStrace
参数-T查看各系统调用函数的所占的时间。或者还有-t、-tt、-ttt。
-p追踪现有的进程,如strace -p pid。(需要root权限,但使用sudo后,还是没获取)
iv、利用strace调度程序
测试程序:
#include<iostream>
#include<fstream>
#include<stdlib.h>
using namespace std;
int main(){
char buffer[256];
ifstream in("input.txt");
if(!in.is_open()){
cout<<"Error opening file"<<endl;
exit(1);
}
while(!in.eof()){
in.getline(buffer,100);
cout<<buffer<<endl;
}
return 0;
}
利用strace ./test4
检测结果如上图所示。