title: 应用调试(一)strace

date: 2019/1/15 23:35:14

toc: true

编译

#tar -xjf strace-4.5.15.tar.bz2
#cd strace-4.5.15/
#patch -p1 <../strace-fix-arm-bad-syscall.patch
#./configure --host=arm-linux CC=arm-linux-gcc
#make
复制到单板的 /usr/bin
#cp strace /usr/bin/

使用

#insmod dri.ko
# strace -o log.txt ./test /dev/xyz0
first_drv_open=0
first_drv_write=0
# 也可以直接跟踪模块
# strace -o log.txt rmmod dri

可以看到log里面有记录

....
close(3) = 0
open("/dev/xyz0", O_RDWR) = 3
write(3, "\1\0\0\0", 4) = 0
exit_group(0) = ?
....

可以加入-t加入秒的时标,-tt为ms的时标3


04:13:18 execve("./test", ["./test", "/dev/xyz0"], [/* 7 vars */]) = 0
04:13:18 uname({sys="Linux", node="(none)", ...}) = 0
04:13:18 brk(0) = 0x11000
04:13:18 access("/etc/ld.so.preload", R_OK) = -1 ENOENT (No such file or directory)
04:13:18 open("/etc/ld.so.cache", O_RDONLY) = -1 ENOENT (No such file or directory)
04:13:18 open("/lib/v4l/half/libc.so.6", O_RDONLY) = -1 ENOENT (No such file or directory)
04:13:18 stat64("/lib/v4l/half", 0xbe83d4e0) = -1 ENOENT (No such file or directory)
04:13:18 open("/lib/v4l/libc.so.6", O_RDONLY) = -1 ENOENT (No such file or directory)
04:13:18 stat64("/lib/v4l", 0xbe83d4e0) = -1 ENOENT (No such file or directory)
04:13:18 open("/lib/half/libc.so.6", O_RDONLY) = -1 ENOENT (No such file or directory)
04:13:18 stat64("/lib/half", 0xbe83d4e0) = -1 ENOENT (No such file or directory)
04:13:18 open("/lib/libc.so.6", O_RDONLY) = 3
04:13:18 read(3, "\177ELF\1\1\1a\0\0\0\0\0\0\0\0\3\0(\0\1\0\0\0\330o\1\000"..., 512) = 512
04:13:18 fstat64(3, {st_mode=S_IFREG|0755, st_size=1435660, ...}) = 0
04:13:18 mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x40015000
04:13:18 mmap2(NULL, 1150612, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x4001e000
04:13:18 mprotect(0x40129000, 56980, PROT_NONE) = 0
04:13:18 mmap2(0x40131000, 16384, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x10b) = 0x40131000
04:13:18 mmap2(0x40135000, 7828, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0x40135000
04:13:18 close(3) = 0
04:13:18 open("/dev/xyz0", O_RDWR) = 3
04:13:18 write(3, "\1\0\0\0", 4) = 0
04:13:18 exit_group(0) = ?

原理

starce是主进程,他去创建一个子进程去执行我们实际需要的应用程序,应用程序的open等C库的函数调用实际上会触发swi异常,在swi异常程序中,会判断是否是被跟踪的,如果有跟踪的标记,会先告诉父进程,等待父进程记录后再去通知我们实的App

# \arch\arm\kernel\entry-armv.S

/*
* SVC mode handlers
*/
.macro svc_entry
....
#ifdef CONFIG_TRACE_IRQFLAGS
bl trace_hardirqs_off
#endif
...
irq_handler
#ifdef CONFIG_TRACE_IRQFLAGS
tst r0, #PSR_I_BIT
bleq trace_hardirqs_on
#endif

深入文档

https://gitee.com/layty/Jz2440/tree/master/Driver/code/33th-strace/ptrace

应用调试(一)strace的更多相关文章

  1. nginx源码分析--使用GDB调试(strace、 pstack )

    nginx源码分析--使用GDB调试(strace.  pstack ) http://blog.csdn.net/scdxmoe/article/details/49070577

  2. linux程序调试命令strace

    strace命令用法详解: strace常用来跟踪进程执行时的系统调用和所接收的信号. 在Linux世界,进程不能直接访问硬件设备,当进程需要访问硬件设备(比如读取磁盘文件,接收网络数据等等)时,必须 ...

  3. 28、应用调试之strace命令来跟踪系统调用

    strace是个工具,在使用时需要先按照,见韦东山书籍: 1.tar xjf starce-4.5.15.tar.bz2 2.cd strace-4.5.15/ 3.patch -p1 < .. ...

  4. 《Debug Hacks》和调试技巧【转】

    转自:https://blog.csdn.net/sdulibh/article/details/46462529 Debug Hacks 作者为吉冈弘隆.大和一洋.大岩尚宏.安部东洋.吉田俊辅,有中 ...

  5. awk 高级技巧

    netstat -nat |awk '{print $6}'|sort|uniq -c|sort -rn netstat -n | awk '/^tcp/ {++S[$NF]};END {for(a ...

  6. netstat命令详解

    它主要的用法和详解! (netstat -na 命令),本文主要是说Linux下的netstat工具,然后详细说明一下各种网络连接状态. netstat -nat |awk ‘{print $}’|s ...

  7. linux下使用shell查看apache IP访问量

    1.查看TCP连接状态 netstat -nat |awk '{print $6}'|sort|uniq -c|sort -rn netstat -n | awk '/^tcp/ {++S[$NF]} ...

  8. Linux netstat详解

    做计算机管理员,我们都必要了解一下netstat这个命令,它是一个查看网络连接状态的工具,在windows下也默认有这个工具.Netstat命令详解 netstat命令怎样使用 如何关闭TIME_WA ...

  9. LINUX 运维命令

    查看3306端口被什么程序占用 [root@DB13 ~]# lsof -i : COMMAND PID USER FD TYPE DEVICE SIZE NODE NAME mysqld mysql ...

随机推荐

  1. 面向对象_内置函数 property

    property 将方法伪装成为属性,可以不用加上()就可以调出其属性. 但是用__dict__,不能调出此属性 from math import pi class Circle: def __ini ...

  2. 【Linux基础】查看硬件信息-系统

    1.查看计算机名 hostname 2.查看内核/操作系统/CPU信息 uname -a   4.查看操作系统版本(Linux) head -n 2 /etc/issue Red Hat Enterp ...

  3. RabbitMQ安装后无法访问https://localhost:15672/ 控制台问题解决

    1.安装完后 我们进入到我们安装到 sbin目录C:\Program Files\RabbitMQ Server\rabbitmq_server-3.7.2\sbin执行:rabbitmq-plugi ...

  4. jquery中数组对象下面的属性名名是动态的如何获取

    <script> let normalListData = []; function temp() { for (var i = 0; i < 10; i++) { let rowC ...

  5. Ubuntu 安装 Docker CE(社区版)

    参考自 https://yeasy.gitbooks.io/docker_practice/install/ubuntu.html#ubuntu-1604- docker-io 是以前早期的版本,版本 ...

  6. 转://linux下的CPU、内存、IO、网络的压力测试工具与方法介绍

    转载地址:http://wushank.blog.51cto.com/3489095/1585927 一.对CPU进行简单测试: 1.通过bc命令计算特别函数 例:计算圆周率 echo "s ...

  7. 等待通知--wait notify

    1.简单理解 在jdk1.5之前用于实现简单的等待通知机制,是线程之间通信的一种最原始的方式.考虑这样一种等待通知的场景:A B线程通过一个共享的非volatile的变量flag来实现通信,每当A线程 ...

  8. linux 网卡的混杂模式的取消

    1.Linux下网卡常用的几种模式说明: 广播方式:该模式下的网卡能够接收网络中的广播信息. 组播方式:设置在该模式下的网卡能够接收组播数据. 直接方式:在这种模式下,只有目的网卡才能接收该数据. 混 ...

  9. 百度杯”CTF比赛 九月场 123

    进去后让登录,先看源码有提示 进到user.php 后发现是空的,看了wp才知道,有bak 下载下来直接爆破 但是那个1990是蛮骚的 直接进去登录 登录成功后是空的,走fd看看是怎么过 的 改包然后 ...

  10. Django学习笔记之表单验证

    表单概述 HTML中的表单 单纯从前端的html来说,表单是用来提交数据给服务器的,不管后台的服务器用的是Django还是PHP语言还是其他语言.只要把input标签放在form标签中,然后再添加一个 ...