博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Mac OS X的利器dtrace,能实现process/file monitor,特别便于排错
阅读量:6069 次
发布时间:2019-06-20

本文共 6185 字,大约阅读时间需要 20 分钟。

hot3.png

例如我想看看为什么Android的make系统出错,

先开启工具追踪瞬间启动的进程命令行,然后做自己想做的事,例如android的mm编译命令

sudo newproc.d####结果############   这是实时显示的2015 Oct  2 20:35:07 54743 <54052> 64b  make -C /Users/q/Documents/android_src -f build/core/main.mk all_modules2015 Oct  2 20:35:07 54743 <54052> 64b  /Applications/Xcode.app/Contents/Developer/usr/bin/make -C /Users/q/Documents/android_src -f build/core/main.mk all_modules2015 Oct  2 20:35:07 54744 <54743> 64b  /bin/bash -c uname -sm2015 Oct  2 20:35:07 54744 <54743> 64b  uname -sm2015 Oct  2 20:35:07 54745 <54743> 64b  /bin/bash -c expr 3.81 \>= 3.812015 Oct  2 20:35:07 54745 <54743> 64b  expr 3.81 >= 3.812015 Oct  2 20:35:07 54746 <54743> 64b  /bin/bash -c pwd2015 Oct  2 20:35:07 54747 <54743> 64b  /bin/bash -c date +%Y%m%d.%H%M%S2015 Oct  2 20:35:07 54747 <54743> 64b  date +%Y%m%d.%H%M%S2015 Oct  2 20:35:07 54748 <54743> 64b  /bin/bash -c uname -sm2015 Oct  2 20:35:07 54748 <54743> 64b  uname -sm2015 Oct  2 20:35:07 54749 <54743> 64b  /bin/bash -c echo a | sed -E -e 's/a/b/' 2>/dev/null2015 Oct  2 20:35:07 54751 <54749> 64b  sed -E -e s/a/b/2015 Oct  2 20:35:07 54752 <54743> 64b  /bin/bash -c test -d device && find device -maxdepth 6 -name AndroidProducts.mk2015 Oct  2 20:35:07 54753 <54752> 64b  find device -maxdepth 6 -name AndroidProducts.mk2015 Oct  2 20:35:07 54754 <54743> 64b  /bin/bash -c test -d vendor && find vendor -maxdepth 6 -name AndroidProducts.mk2015 Oct  2 20:35:07 54755 <54743> 64b  /bin/bash -c test -d device && find device -maxdepth 4 -path '*/generic/BoardConfig.mk'2015 Oct  2 20:35:07 54756 <54755> 64b  find device -maxdepth 4 -path */generic/BoardConfig.mk2015 Oct  2 20:35:07 54757 <54743> 64b  /bin/bash -c test -d vendor && find vendor -maxdepth 4 -path '*/generic/BoardConfig.mk'2015 Oct  2 20:35:07 54758 <54743> 64b  /bin/bash -c prebuilts/gcc/darwin-x86/arm/arm-linux-androideabi-4.8/bin/arm-linux-androideabi-gcc -fno-exceptions -Wno-multichar -msoft-float (...)2015 Oct  2 20:35:07 54758 <54743> 64b  prebuilts/gcc/darwin-x86/arm/arm-linux-androideabi-4.8/bin/arm-linux-androideabi-gcc -fno-exceptions -Wno-multichar -msoft-float -ffunction-sections -fdata-sections <...>2015 Oct  2 20:35:07 54759 <54743> 64b  /bin/bash -c prebuilts/gcc/darwin-x86/arm/arm-linux-androideabi-4.8/bin/arm-linux-androideabi-gcc -fno-exceptions -Wno-multichar -msoft-float (...)2015 Oct  2 20:35:07 54759 <54743> 64b  prebuilts/gcc/darwin-x86/arm/arm-linux-androideabi-4.8/bin/arm-linux-androideabi-gcc -fno-exceptions -Wno-multichar -msoft-float -ffunction-sections -fdata-sections <...>2015 Oct  2 20:35:07 54760 <54743> 64b  /bin/bash -c build/core/find-jdk-tools-jar.sh2015 Oct  2 20:35:07 54760 <54743> 64b  /bin/sh build/core/find-jdk-tools-jar.sh2015 Oct  2 20:35:07 54761 <54760> 64b  which javac2015 Oct  2 20:35:07 54762 <54760> 64b  ls -l /usr/bin/javac2015 Oct  2 20:35:08 54765 <54763> 64b  sed -e s/.* -> //2015 Oct  2 20:35:08 54767 <54760> 64b  sed -e s:\(.*\)/bin/javac.*:\1/lib/tools.jar:2015 Oct  2 20:35:08 54768 <54743> 64b  /bin/bash -c java -version 2>&12015 Oct  2 20:35:08 54769 <54768> 64b  java -version2015 Oct  2 20:35:08 54769 <54768> 64b  /usr/bin/java -version2015 Oct  2 20:35:08 54770 <54743> 64b  /bin/bash -c function sgrax() { while [ -n "$1" ] ; do echo $1 ; shift ; done } ; ( sgrax  10 11 12 13 14 15 16 17 18 19 20 21 4 5 6 7 8 9 cu (...)2015 Oct  2 20:35:08 54773 <54771> 64b  sort -g2015 Oct  2 20:35:08 54774 <54743> 64b  /bin/bash -c python -c "import platform; print(platform.platform())"2015 Oct  2 20:35:08 54774 <54743> 64b  python -c import platform; print(platform.platform())2015 Oct  2 20:35:08 54774 <54743> 64b  python -c import platform; print(platform.platform())2015 Oct  2 20:35:08 54775 <54774> 64b  sh -c uname -p 2> /dev/null2015 Oct  2 20:35:08 54776 <54775> 64b  uname -p2015 Oct  2 20:35:08 54777 <54774> 64b  file /usr/bin/python2015 Oct  2 20:35:08 54778 <54743> 64b  /bin/bash -c mkdir -p /Users/q/Documents/android_out/android_src/target/product/generic/ && echo "PREVIOUS_BUILD_CONFIG := full-eng-{en_US,en (...)2015 Oct  2 20:35:08 54779 <54778> 64b  mkdir -p /Users/q/Documents/android_out/android_src/target/product/generic/2015 Oct  2 20:35:08 54780 <54743> 64b  /bin/bash -c mkdir -p /Users/q/Documents/android_out/android_src ; echo a > /Users/q/Documents/android_out/android_src/casecheck.txt; echo B  (...)2015 Oct  2 20:35:08 54781 <54780> 64b  mkdir -p /Users/q/Documents/android_out/android_src2015 Oct  2 20:35:08 54782 <54780> 64b  cat /Users/q/Documents/android_out/android_src/casecheck.txt2015 Oct  2 20:35:08 54783 <54743> 64b  /bin/bash -c pwd2015 Oct  2 20:35:08 54784 <54743> 64b  /bin/bash -c unset _JAVA_OPTIONS && java -version 2>&12015 Oct  2 20:35:08 54785 <54784> 64b  java -version2015 Oct  2 20:35:08 54785 <54784> 64b  /usr/bin/java -version2015 Oct  2 20:35:08 54786 <54743> 64b  /bin/bash -c unset _JAVA_OPTIONS && javac -version 2>&12015 Oct  2 20:35:08 54787 <54786> 64b  javac -version2015 Oct  2 20:35:08 54787 <54786> 64b  /usr/bin/javac -version2015 Oct  2 20:35:08 54788 <54743> 64b  /bin/bash -c echo 'java version "1.8.0_51" Java(TM) SE Runtime Environment (build 1.8.0_51-b16) Java HotSpot(TM) 64-Bit Server VM (build 25.5 (...)2015 Oct  2 20:35:08 54790 <54788> 64b  grep ^java .*[ "]1\.7[\. "$]2015 Oct  2 20:35:08 54791 <54743> 64b  /bin/bash -c echo 'javac 1.8.0_51' | grep '[ "]1\.7[\. "$]'2015 Oct  2 20:35:08 54793 <54791> 64b  grep [ "]1\.7[\. "$]

同样的,iosnoop用来实时显示文件访问,不帖了。其他的dtruss和dapptrace有心人可以体验。

dtrace内部做得实在令人感动,全系统设置了98万多个静态trace点,

dtrace甚至能够动态把第三方dll(*.dylb)的公开函数都给高速完美的hook了,自动产生出trace,据内部大拿说用的是函数指针表补丁+int3技术,反正速度比windows上的同类型api spy工具快多了,而且稳定,而且没有影响用户空间的内存! 完全在内核做的,所有的api的参数和堆栈都可以自己写script取出。当然,也可以自己调用dtrace api产生独特的trace信息,例如nodejs, chrome, firefox等东西里都有dtrace的身影!

相比之下,而Windows系统的类似的机制ETW(Event Trace for Windows),静态trace点,却只有几万个。ETW也无法这样动态地在第三方dll里插入trace,反正得需要自己在dll调用ETW的api产生trace。基于ETW的xperf等工具也弱多了,不仅不能够实施显示信息,而且不能够显示api名称,也无法写script控制,Windows老大这方面落后了。

dtrace这种东西,练好了就像是练了某某门派的高级内功心法差不多,有底气不慌。

Added 2015/10/16: 后来发现iosnoop对于文件活动的监测不够完全,因为它漏掉了stat之类的文件状态检查api。发现Mac里自带的Instruments工具是最强的,图形界面,实时的,还可以看到顶层api的名称,还可以grep, 而且还可以输出成Dtrace script。123931_nD7u_2253129.jpg

转载于:https://my.oschina.net/osexp2003/blog/513249

你可能感兴趣的文章
网站内容禁止复制解决办法
查看>>
Qt多线程
查看>>
我的友情链接
查看>>
Ubuntu12.04 编译android源代码及生成模拟器经历分享
查看>>
KVM网络桥接设置方法
查看>>
Puppet学习手册:Puppet Yum安装
查看>>
我的友情链接
查看>>
ansible学习记录
查看>>
网思科技校园网计费解决方案
查看>>
我的友情链接
查看>>
携程 Apollo分布式部署
查看>>
2017 Hackatari Codeathon B. 2Trees(深搜)(想法)
查看>>
单词统计
查看>>
输入一个数字计算圆的面积
查看>>
在Delphi中隐藏程序进程
查看>>
AngularJS PhoneCat代码分析
查看>>
maven错误解决:编码GBK的不可映射字符
查看>>
2016/4/19 反射
查看>>
SharePoint Wiki发布页面的“保存冲突”
查看>>
oracle 10g 数据库与客户端冲突导致实例创建无监听问题
查看>>