例如我想看看为什么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。