前几日遇到样机在运行一段时间后出现显示异常问题,查看Logcat日志只能看到SurfaceFlinger因为Binder异常EX_TRANSACTION_FAILED导致重启。但是具体什么原因导致而此问题却无从得知,查看dmesg信息也不足。并且SurfaceFlinger重启后显示恢复正常,从而难以找到确切原因。

如果能够在SurfaceFlinger重启时保存下之前很长一段时间的日志将非常有用。因此写了如下脚本。

#!/bin/bash

rm *.log -rf;

rm *.info -rf;

adb wait-for-device;

echo "get proccess and thread info!";

adb shell ps -AT > start_ps-AT.info;

echo "make test log!";

startpid=`sudo adb shell ps -ef | grep composer | awk '{print $2}'`

count=0

flg=0

while true; do

#echo "To make logcat.log!";

#adb logcat > logcat$count.log

logproc=`sudo adb shell ps -ef -o ARGS | grep "logcat -t"`

if [ -n "$logproc" ]

then

echo "Wait the logcat end!";

else

adb logcat -t 5000 > logcat$count.log &

dmesgpid=`sudo adb shell ps -ef | grep dmesg | awk '{print $2}'`

adb shell dmesg -w> dmesg$count.log &

if [ -n "$dmesgpid" ]

then

adb shell kill $dmesgpid;

fi

echo "To make logcat$count.log & dmesg$count.log!";

count=$[++count]

fi

endpid=`sudo adb shell ps -ef | grep composer | awk '{print $2}'`

if [ $endpid -eq $startpid ]

then

adb shell ps -AT > end_ps-AT.info;

sleep 0.2s

else

echo "proccess dead";

adb logcat > logcat_last.log &

adb shell dmesg > dmesg_last.log &

sleep 5s

break;

fi

if [ $count -gt 50 ]

then

count=0 ;

rm dmesg[0-9].log -rf;

rm logcat[0-9].log -rf;

fi

if [ $flg -eq 0 ]

then

continue;

fi

if [ $count -gt 25 ]

then

flg=1;

rm dmesg1[0-9].log -rf;

rm logcat1[0-9].log -rf;

fi

done

通过此脚本可以连续的获取dmesg和logcat的日志从而分析处具体的问题,并且可以自动监测停止并保存日志。

这里特分享给大家,大家可以根据自己的需要修改使用。

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐