strace工具的实现原理

strace是Linux系统下的一个用来跟踪系统调用的工具,它的实现基础是ptrace系统调用。使用strace工具可以跟踪一个程序执行过程中发生的系统调用。

我这里讲到的内容有一点点和mips体系相关,不过不熟悉mips也不影响阅读。

ptrace系统调用

ptrace系统调用提供了一种方法来跟踪和控制进程的执行,它可以读取和修改进程地址空间中的内容,包括寄存器的值。ptrace主要用于实现断点调试和跟踪系统调用。该系统调用的原型如下:

long ptrace(enum __ptrace_request request, pid_t pid, void *addr,void *data);

ptrace的四个参数的含义为:

1.   request:用于选择一个操作,见下文。

2.   pid:目标进程即被跟踪进程的pid。

3.   addr和data用于修改和拷贝被跟踪进程的进程地址空间的数据。

下面的内容中将用父进程指代跟踪者,用子进程指代被跟踪者。实际上,在一个进程被跟踪之后,跟踪者进程会在某种意义上充当被跟踪进程的父进程(如使用ps命令就可以看到他们的父子关系),而子进程真正的父进程被保存在其task_struct结构的real_parent成员中。

使用ptrace跟踪进程

父进程跟踪一个进程的方式有两种:1.调用fork(),然后子进程打上PTRACE_TRACEME标记,并执行exec。2.父进程可以给自己打上PTRACE_ATTACH标记来跟踪一个已有进程。

一个进程被跟踪后,他只要接收到一个信号(即使这个信号被设置为忽略)就会停止运行(SIGKILL除外),然后父进程会在每次调用wait()时得到子进程停止运行的通知,这时父进程就可以检测和修改子进程了,随后父进程可以让子进程继续运行。

当父进程不想跟踪了,可以通过设置PTRACE_KILL标记来终止子进程的运行。也可以通过设置PTRACE_DETACH标记让子进程解除被跟踪,继续正常运行。

常用的request

PTRACE_TRACEME

进程设置这个request目的是让自己被父进程跟踪。任何发送到该子进程的信号(除了SIGKILL)都会导致他停下来,并在父进程wait()的时候通知到父进程。另外,子进程后续调用exec会导致子进程自己收到一个SIGTRAP信号,这是为了让父进程有机会在exec的新程序开始执行前获得控制权。

除非一个进程知道父进程要跟踪他,一般不会去设置这个request。设置这个请求时,pid,addr和data三个参数都会被忽略。

这个request只供子进程设置,其他的request都是只供父进程使用的。相应的,下面的request中,参数pid为被跟踪的子进程的pid。

PTRACE_ATTACH

将pid指定的进程作为自己要跟踪的进程,并开始跟踪。这和子进程自己调用PTRACE_TRACEME的效果相同。

设置这个request时,子进程会首先收到一个SIGSTOP信号,但并不会停止,只是导致跟踪者进程第一次被中断,从而开始跟踪,否则只能等到子进程接收到第一个信号时才开始跟踪。之后当子进程有待决信号时,进程总是会暂停,这时父进程通过SIGCHLD信号得到通知。在子进程暂停前,父进程可使用wait函数等待。

参数addr和data会被忽略。

PTRACE_CONT

让被停掉的子进程继续运行,而当子进程再次接收到信号时会暂停。

参数data如果被设置为一个非零值并且不是SIGSTOP,那data就是父进程发送给子进程的信号,否则,不给子进程发送信号。这样一来,父进程可以控制是否向子进程发送一个信号。

参数addr会被忽略。

PTRACE

  • 4
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
好的,下面是Android TP驱动学习文档: ## 1. 驱动代码原理 Android TP驱动主要涉及以下几个方面: ### 1.1 输入子系统 输入子系统是Android系统中用于处理和管理输入设备的一个子系统,包括设备驱动程序、输入事件的生成和处理、输入设备的注册和注销等功能。输入设备的驱动程序需要实现input_dev结构体中的各个方法,如probe、remove、open、close、ioctl、read、poll、event等。 ### 1.2 触摸屏控制器 触摸屏控制器是一个独立的芯片,通过I2C、SPI或USB等接口与主处理器相连,用于接收触摸屏的输入信号并将其转换成数字信号。触摸屏控制器的驱动程序需要实现input_dev结构体中的event方法,将触摸屏的输入事件发送到输入子系统中。 ### 1.3 触摸屏传感器 触摸屏传感器是一个透明的薄膜,在触摸屏上覆盖一层,用于检测用户的触摸输入,并将其转换成电信号。触摸屏传感器包括电阻式触摸屏、电容式触摸屏、表面声波式触摸屏等多种类型,不同类型的传感器需要不同的驱动程序来处理。 ### 1.4 Linux内核 Android系统基于Linux内核开发,因此TP驱动程序需要在Linux内核中实现。在内核中,可以使用工具链进行编译和调试,通过Kconfig和Makefile文件进行配置和构建。 ## 2. 驱动框图 Android TP驱动的框图如下所示: ``` +---------------------+ +---------------------+ | | | | | Touch Panel Sensor +---+ Touch Panel Control | | | | | +---------------------+ +---------------------+ | | | | v v +---------------------+ +---------------------+ | | | | | Input +---+ Kernel | | Subsystem | | | | | | | +---------------------+ +---------------------+ ``` 其中,输入子系统负责接收来自触摸屏控制器和传感器的输入事件,将其转换成标准的输入事件格式,并发送到内核中。内核负责处理输入事件,将其转发给应用程序或系统服务进行处理。 ## 3. 调试方法 Android TP驱动调试主要包括以下几个方面: ### 3.1 调试工具 在驱动开发过程中,可以使用一些调试工具来帮助定位问题,如printk、dmesg、strace、gdb等。printk可以输出调试信息到内核日志中,dmesg可以查看内核日志中的输出信息,strace可以跟踪应用程序的系统调用,gdb可以对内核进行调试。 ### 3.2 调试方法 在调试过程中,可以使用一些方法来定位问题,如插入断点、输出调试信息、分析内存泄漏、跟踪函数调用栈等。其中,插入断点可以暂停程序执行,输出调试信息可以查看程序的执行过程,分析内存泄漏可以检测程序中的内存问题,跟踪函数调用栈可以查看程序的执行路径。 ## 4. 常见问题解决思路 在TP驱动开发过程中,可能会遇到以下一些常见问题: ### 4.1 触摸屏输入不灵敏 触摸屏输入不灵敏可能是由于触摸屏传感器的灵敏度不足或者触摸屏控制器的配置参数不正确导致的。可以尝试调整控制器的配置参数,如增加采样率、调整滤波算法等,或者更换传感器来解决问题。 ### 4.2 触摸屏输入漂移 触摸屏输入漂移可能是由于传感器的灵敏度不足或者触摸屏控制器的噪声滤波算法不正确导致的。可以尝试调整控制器的噪声滤波算法或者更换传感器来解决问题。 ### 4.3 触摸屏输入失灵 触摸屏输入失灵可能是由于控制器与主处理器之间的通信故障或者控制器硬件故障导致的。可以尝试重新检查控制器与主处理器之间的连接,或者更换控制器硬件来解决问题。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值