linux调试工具——strace

当然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

检测结果如上图所示。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值