调试休眠和唤醒
在做Android或者是Linux的调试中,在消费电子领域中对用电的要求比较的严格,所以大家对设备的休眠比较关注。一定要在系统发起休眠命令的时候要进入,这里来看下平时可以采取什么方式来调试。
1、no_console_suspend
在kernel启动参数里面加上no_console_suspend,这个是最基本的,因为kernel在把console suspend掉以后,不管里面出了什么事情,从串口上都看不到。大部分在suspend/resume时候的死机都可以通过串口看到kernel Panic的信息,这样才会知道是哪里出了问题。因为有的时候resume出错,或者suspend到很后面出错的console不加这个参数都看不到。
bootargs中找到console在其后添加no_console_suspend例如
"console=ttyO0,115200n8 no_console_suspend"
或者在Uboot中直接设置后boot:
setenv console ttyO0,115200n8 no_console_suspend
2、initcall_debug
这个也许知道的人不多, 其实有的时候你不知道哪个driver在suspend/resume的时候出错的时候,很迷茫, 就想在哪里加上一些调试信息来看看是哪里的driver, 其实有些时候加的不合适的话, 会看不到很多有用的信息。其实kernel本身已经有这样的功能了(只不过不是很人性化)。
echo 1 > /sys/module/kernel/parameters/initcall_debugecho 9 > /proc/sys/kernel/printk
3、Wakelocks
cat /proc/wakelocks
下面的输出信息就是从galaxy nexus手机中cat出来的信息。
----------------------------------------------------------------------------------------------------------------------------
shell@android:/ $ cat /proc/wakelocks
cat /proc/wakelocks
name count expire_count wake_count active_since total_time sleep_time max_time last_change
"mipi_link" 69785 0 532 0 43248494951477 35451590103286 96727142333 184684078765708
"secril_fmt-interface" 101115 0 0 0 73367645997 56320313151 10838775632 184683582671958
"PowerManagerService" 20630 0 0 0 157187043244357 138806242646218 1796233337401 184677811614830
"alarm" 25844 0 1891 0 442550295993 433528323276 677124023 184677762389977
"KeyEvents" 100068 0 0 0 17888672017 3594574034 467163086 184659815185387
"alarm_rtc" 8306 2152 0 0 5017010652325 4942625154243 1998779293 183585703704674
"power-supply" 662 0 0 0 474365222 398406981 25146484 184648222167809
"max17040-battery" 4942 0 0 0 107889100461 99009583842 204589843 184648222045738
"twl6030 adc" 55740 0 0 0 136497710917 63467041679 14465332 184648221282799
"radio-interface" 5649 0 0 0 5987510983528 4494391751372 3640716553 184167530090172
"main" 385 0 0 0 27589451721195 0 1801661376953 183621222076256
"event2-301" 7512 0 0 0 111976470123 111660643686 407470703 183620469085534
"gpio_input" 826 0 52 0 3543701172 1258148215 6103516 183620468932946
"gpio_input" 608 0 17 0 3142333999 509887700 20996093 183617260894616
"event1-301" 73319 0 0 0 6583892939 0 25177002 183615457549889
"vibrator" 464 0 0 0 133468658426 26794189441 1003906250 183598213287194
"power-supply" 21 0 0 0 5523682 3387452 396729 183579602599937
"musb_autosuspend_wake_lock" 6301 0 3505 0 322516479827 312862884844 229400633 183578392913659
"mmc0_detect" 12914 1 0 0 1781005894 1146667475 605804444 183578384948571
"prx_wake_lock" 197 197 43 0 680666198829 311204620424 17666870119 183468741668546
"wlan_ctrl_wake" 912 912 0 0 1556927338368 827446624987 5618377684 182058829467620
"wlan_rx_wake" 4811 4811 0 0 6445298708108 3614577642010 38278076173 182058829467620
"wlan_wake" 104298 0 14 0 133928470101 54380007761 875823975 181999492339936
"suspend_backoff" 35 35 0 0 349706695589 349698791545 10000762940 180100141631934
"power-supply" 18 0 0 0 4150390 2227783 335693 179754180908064
"sec_jack_det" 6 6 0 0 29969024660 19172149659 4997924804 178495711700304
"BTLowPower" 34 31 0 0 34581329374 0 2529754639 173389314849718
"secril_rfs-interface" 59 0 0 0 6252319329 1922790526 295440674 172882026977411
"gps-lock" 13 0 0 0 402296051025 158244323729 136370635986 153166899169669
"client-interface" 26 0 0 0 2044672 183105 1251220 8923188262929
"mmc1_detect" 2 1 0 0 782775880 0 666595460 303422546390
"event5-301" 0 0 0 0 0 0 0 0
"tf_driver" 5 0 0 0 225280762 0 225067139 10488037113
"serial-debug" 0 0 0 0 0 0 0 0
"pogo" 0 0 0 0 0 0 0 0
"sii9234(mhl)" 0 0 0 0 0 0 0 0
"unknown_wakeups" 0 0 0 0 0 0 0 0
"deleted_wake_locks" 45 0 0 0 855010987 853912354 229522704 0
"vbus-tuna_otg" 18 17 0 1110345611571 10458468719490 8412140533438 4085013397217 183578602355798
"nfc" 1076 1076 121 0 563650971468 405111420422 7022674561 183622267028649
----------------------------------------------------------------------------------------------------------------------------
可以从上面的信息中可以看到vbus-tuna_otg这个服务还没有把wakelock来释放掉。当然如果你想了解这个wakelocks的内容,或者是想添加一些自己希望添加的信息,可以参考kernel/kernel/power/wakelocks.c这个文件。
4、dunpsys命令
The dumpsys tool runs on the device and dumps interesting information about the status of system services.
dumpsys power
127|shell@android:/ $ dumpsys power
dumpsys power
Power Manager State:
mIsPowered=true mPowerState=0 mScreenOffTime=1561998 ms
mPartialCount=0
mWakeLockState=
mUserState=
mPowerState=
mLocks.gather=
mNextTimeout=183628133 now=185182465 -1554s from now
mDimScreen=true mStayOnConditions=0 mPreparingForScreenOn=false mSkippedScreenOn=false
mScreenOffReason=2 mUserState=0
mBroadcastQueue={-1,-1,-1}
mBroadcastWhy={0,0,0}
mPokey=0 mPokeAwakeonSet=false
mKeyboardVisible=false mUserActivityAllowed=false
mKeylightDelay=6000 mDimDelay=47000 mScreenOffDelay=7000
mPreventScreenOn=false mScreenBrightnessOverride=-1 mButtonBrightnessOverride=-1
mScreenOffTimeoutSetting=60000 mMaximumScreenOffTimeout=2147483647
mLastScreenOnTime=0
mBroadcastWakeLock=UnsynchronizedWakeLock(mFlags=0x1 mCount=0 mHeld=false)
mStayOnWhilePluggedInScreenDimLock=UnsynchronizedWakeLock(mFlags=0x6 mCount=0 mHeld=false)
mStayOnWhilePluggedInPartialLock=UnsynchronizedWakeLock(mFlags=0x1 mCount=0 mHeld=false)
mPreventScreenOnPartialLock=UnsynchronizedWakeLock(mFlags=0x1 mCount=0 mHeld=false)
mProximityPartialLock=UnsynchronizedWakeLock(mFlags=0x1 mCount=0 mHeld=false)
mProximityWakeLockCount=0
mProximitySensorEnabled=false
mProximitySensorActive=false
mProximityPendingValue=-1
mLastProximityEventTime=320267148
mLightSensorEnabled=false mLightSensorAdjustSetting=0.0
mLightSensorValue=114.0 mLightSensorPendingValue=193.0
mHighestLightSensorValue=111 mWaitingForFirstLightSensor=false
mLightSensorPendingDecrease=false mLightSensorPendingIncrease=false
mLightSensorScreenBrightness=59 mLightSensorButtonBrightness=0 mLightSensorKeyboardBrightness=0
mUseSoftwareAutoBrightness=true
mAutoBrightessEnabled=true
mScreenBrightnessAnimator:
animating: start:59, end:0, duration:200, current:0
startSensorValue:111 endSensorValue:111
startTimeMillis:323078467 now:324640479
currentMask:SCREEN_BRIGHT_BIT
mLocks.size=0:
mPokeLocks.size=0:
补充dumpsys
Android has an interesting command called dumpsys to dump some system information. Even described on adb manual I think that some points should be reinforced. In order to get the complete status just run (will produce a large output):
adb shell dumpsys
Also you can apply filters to running services:
1 SurfaceFlinger
2 accessibility
3 account
4 activity
5 alarm
6 appwidget
7 audio
8 backup
9 battery
10 batteryinfo
11 bluetooth
12 bluetooth_a2dp
13 clipboard
14 connectivity
15 content
16 cpuinfo
17 device_policy
18 devicestoragemonitor
19 diskstats
20 dropbox
21 entropy
22 ethernet
23 hardware
24 input_method
25 iphonesubinfo
26 isms
27 keybar
28 location
29 media.audio_flinger
30 media.audio_policy
31 media.camera
32 media.player
33 meminfo
34 mount
35 netstat
36 network_management
37 notification
38 package
39 permission
40 phone
41 power
42 search
43 sensorservice
44 simphonebook
45 statusbar
46 telephony.registry
47 throttle
48 uimode
49 usagestats
50 vibrator
51 wallpaper
52 wifi
53 window
Some examples:
adb shell dumpsys wifi
adb shell dumpsys cpuinfo
I suggest you try other items on the list above and be creative using all the power of Unix pipes. Example, to get all memory allocated by each process you can do something like:
adb shell dumpsys meminfo | grep "allocated:" | awk '{total = total + $5}END{print total}
在做Android或者是Linux的调试中,在消费电子领域中对用电的要求比较的严格,所以大家对设备的休眠比较关注。一定要在系统发起休眠命令的时候要进入,这里来看下平时可以采取什么方式来调试。
1、no_console_suspend
在kernel启动参数里面加上no_console_suspend,这个是最基本的,因为kernel在把console suspend掉以后,不管里面出了什么事情,从串口上都看不到。大部分在suspend/resume时候的死机都可以通过串口看到kernel Panic的信息,这样才会知道是哪里出了问题。因为有的时候resume出错,或者suspend到很后面出错的console不加这个参数都看不到。
bootargs中找到console在其后添加no_console_suspend例如
"console=ttyO0,115200n8 no_console_suspend"
或者在Uboot中直接设置后boot:
setenv console ttyO0,115200n8 no_console_suspend
2、initcall_debug
这个也许知道的人不多, 其实有的时候你不知道哪个driver在suspend/resume的时候出错的时候,很迷茫, 就想在哪里加上一些调试信息来看看是哪里的driver, 其实有些时候加的不合适的话, 会看不到很多有用的信息。其实kernel本身已经有这样的功能了(只不过不是很人性化)。
echo 1 > /sys/module/kernel/parameters/initcall_debugecho 9 > /proc/sys/kernel/printk
3、Wakelocks
cat /proc/wakelocks
下面的输出信息就是从galaxy nexus手机中cat出来的信息。
----------------------------------------------------------------------------------------------------------------------------
shell@android:/ $ cat /proc/wakelocks
cat /proc/wakelocks
name count expire_count wake_count active_since total_time sleep_time max_time last_change
"mipi_link" 69785 0 532 0 43248494951477 35451590103286 96727142333 184684078765708
"secril_fmt-interface" 101115 0 0 0 73367645997 56320313151 10838775632 184683582671958
"PowerManagerService" 20630 0 0 0 157187043244357 138806242646218 1796233337401 184677811614830
"alarm" 25844 0 1891 0 442550295993 433528323276 677124023 184677762389977
"KeyEvents" 100068 0 0 0 17888672017 3594574034 467163086 184659815185387
"alarm_rtc" 8306 2152 0 0 5017010652325 4942625154243 1998779293 183585703704674
"power-supply" 662 0 0 0 474365222 398406981 25146484 184648222167809
"max17040-battery" 4942 0 0 0 107889100461 99009583842 204589843 184648222045738
"twl6030 adc" 55740 0 0 0 136497710917 63467041679 14465332 184648221282799
"radio-interface" 5649 0 0 0 5987510983528 4494391751372 3640716553 184167530090172
"main" 385 0 0 0 27589451721195 0 1801661376953 183621222076256
"event2-301" 7512 0 0 0 111976470123 111660643686 407470703 183620469085534
"gpio_input" 826 0 52 0 3543701172 1258148215 6103516 183620468932946
"gpio_input" 608 0 17 0 3142333999 509887700 20996093 183617260894616
"event1-301" 73319 0 0 0 6583892939 0 25177002 183615457549889
"vibrator" 464 0 0 0 133468658426 26794189441 1003906250 183598213287194
"power-supply" 21 0 0 0 5523682 3387452 396729 183579602599937
"musb_autosuspend_wake_lock" 6301 0 3505 0 322516479827 312862884844 229400633 183578392913659
"mmc0_detect" 12914 1 0 0 1781005894 1146667475 605804444 183578384948571
"prx_wake_lock" 197 197 43 0 680666198829 311204620424 17666870119 183468741668546
"wlan_ctrl_wake" 912 912 0 0 1556927338368 827446624987 5618377684 182058829467620
"wlan_rx_wake" 4811 4811 0 0 6445298708108 3614577642010 38278076173 182058829467620
"wlan_wake" 104298 0 14 0 133928470101 54380007761 875823975 181999492339936
"suspend_backoff" 35 35 0 0 349706695589 349698791545 10000762940 180100141631934
"power-supply" 18 0 0 0 4150390 2227783 335693 179754180908064
"sec_jack_det" 6 6 0 0 29969024660 19172149659 4997924804 178495711700304
"BTLowPower" 34 31 0 0 34581329374 0 2529754639 173389314849718
"secril_rfs-interface" 59 0 0 0 6252319329 1922790526 295440674 172882026977411
"gps-lock" 13 0 0 0 402296051025 158244323729 136370635986 153166899169669
"client-interface" 26 0 0 0 2044672 183105 1251220 8923188262929
"mmc1_detect" 2 1 0 0 782775880 0 666595460 303422546390
"event5-301" 0 0 0 0 0 0 0 0
"tf_driver" 5 0 0 0 225280762 0 225067139 10488037113
"serial-debug" 0 0 0 0 0 0 0 0
"pogo" 0 0 0 0 0 0 0 0
"sii9234(mhl)" 0 0 0 0 0 0 0 0
"unknown_wakeups" 0 0 0 0 0 0 0 0
"deleted_wake_locks" 45 0 0 0 855010987 853912354 229522704 0
"vbus-tuna_otg" 18 17 0 1110345611571 10458468719490 8412140533438 4085013397217 183578602355798
"nfc" 1076 1076 121 0 563650971468 405111420422 7022674561 183622267028649
----------------------------------------------------------------------------------------------------------------------------
可以从上面的信息中可以看到vbus-tuna_otg这个服务还没有把wakelock来释放掉。当然如果你想了解这个wakelocks的内容,或者是想添加一些自己希望添加的信息,可以参考kernel/kernel/power/wakelocks.c这个文件。
4、dunpsys命令
The dumpsys tool runs on the device and dumps interesting information about the status of system services.
dumpsys power
127|shell@android:/ $ dumpsys power
dumpsys power
Power Manager State:
mIsPowered=true mPowerState=0 mScreenOffTime=1561998 ms
mPartialCount=0
mWakeLockState=
mUserState=
mPowerState=
mLocks.gather=
mNextTimeout=183628133 now=185182465 -1554s from now
mDimScreen=true mStayOnConditions=0 mPreparingForScreenOn=false mSkippedScreenOn=false
mScreenOffReason=2 mUserState=0
mBroadcastQueue={-1,-1,-1}
mBroadcastWhy={0,0,0}
mPokey=0 mPokeAwakeonSet=false
mKeyboardVisible=false mUserActivityAllowed=false
mKeylightDelay=6000 mDimDelay=47000 mScreenOffDelay=7000
mPreventScreenOn=false mScreenBrightnessOverride=-1 mButtonBrightnessOverride=-1
mScreenOffTimeoutSetting=60000 mMaximumScreenOffTimeout=2147483647
mLastScreenOnTime=0
mBroadcastWakeLock=UnsynchronizedWakeLock(mFlags=0x1 mCount=0 mHeld=false)
mStayOnWhilePluggedInScreenDimLock=UnsynchronizedWakeLock(mFlags=0x6 mCount=0 mHeld=false)
mStayOnWhilePluggedInPartialLock=UnsynchronizedWakeLock(mFlags=0x1 mCount=0 mHeld=false)
mPreventScreenOnPartialLock=UnsynchronizedWakeLock(mFlags=0x1 mCount=0 mHeld=false)
mProximityPartialLock=UnsynchronizedWakeLock(mFlags=0x1 mCount=0 mHeld=false)
mProximityWakeLockCount=0
mProximitySensorEnabled=false
mProximitySensorActive=false
mProximityPendingValue=-1
mLastProximityEventTime=320267148
mLightSensorEnabled=false mLightSensorAdjustSetting=0.0
mLightSensorValue=114.0 mLightSensorPendingValue=193.0
mHighestLightSensorValue=111 mWaitingForFirstLightSensor=false
mLightSensorPendingDecrease=false mLightSensorPendingIncrease=false
mLightSensorScreenBrightness=59 mLightSensorButtonBrightness=0 mLightSensorKeyboardBrightness=0
mUseSoftwareAutoBrightness=true
mAutoBrightessEnabled=true
mScreenBrightnessAnimator:
animating: start:59, end:0, duration:200, current:0
startSensorValue:111 endSensorValue:111
startTimeMillis:323078467 now:324640479
currentMask:SCREEN_BRIGHT_BIT
mLocks.size=0:
mPokeLocks.size=0:
补充dumpsys
Android has an interesting command called dumpsys to dump some system information. Even described on adb manual I think that some points should be reinforced. In order to get the complete status just run (will produce a large output):
adb shell dumpsys
Also you can apply filters to running services:
1 SurfaceFlinger
2 accessibility
3 account
4 activity
5 alarm
6 appwidget
7 audio
8 backup
9 battery
10 batteryinfo
11 bluetooth
12 bluetooth_a2dp
13 clipboard
14 connectivity
15 content
16 cpuinfo
17 device_policy
18 devicestoragemonitor
19 diskstats
20 dropbox
21 entropy
22 ethernet
23 hardware
24 input_method
25 iphonesubinfo
26 isms
27 keybar
28 location
29 media.audio_flinger
30 media.audio_policy
31 media.camera
32 media.player
33 meminfo
34 mount
35 netstat
36 network_management
37 notification
38 package
39 permission
40 phone
41 power
42 search
43 sensorservice
44 simphonebook
45 statusbar
46 telephony.registry
47 throttle
48 uimode
49 usagestats
50 vibrator
51 wallpaper
52 wifi
53 window
Some examples:
adb shell dumpsys wifi
adb shell dumpsys cpuinfo
I suggest you try other items on the list above and be creative using all the power of Unix pipes. Example, to get all memory allocated by each process you can do something like:
adb shell dumpsys meminfo | grep "allocated:" | awk '{total = total + $5}END{print total}