如何在Android 或Linux 下,做Suspend /Resume 的Debug【转】

转自:http://blog.csdn.net/jacobywu/article/details/24735521

目录(?)[-]

  1. Question
  2. Answer
    1. 加boot 參數 no_console_suspend
    2. initcall_debug
    3. suspend_test
    4. wakelock
    5. power0
    6. earlysuspend
    7. suspendresume 時間 fine tune

Question:

如何在Linux 或 Android下得到足夠的information,來做Power Management的fine tune呢?

Answer:

在Linux或Android下,做power management 的調適時,常遇到沒有足夠的information,可以做為debug時的依據和參考

我們整理了幾個常用的參數或Command,可供設計者,得到足夠的Informaiton 做Suspend / Resume的function Debug。

加boot 參數 no_console_suspend

基本上我們常常使用console做為suspend function的debug的Information source,但原始的source code在suspend過程中,會將console關掉。所以我們看到一定程度後就再也看不到message了。

但是我們並不知道在Suspend的過程中,系統到底發生了什麼事,可能造成無法suspend。
為此,我們就會在kernel 啟動參數中加上no_console_suspend這個參數。在AM/DM37x APM中是修改boot.scr檔案參數

#!/bin/sh
cat <<EOF > boot.cmd
if fatload mmc 0 82000000 uImage
then
 echo ***** Kernel: /dev/mmcblk0p1/uImage *****
fi
echo ***** RootFS: /dev/mmcblk0p2 *****
# Pantherboard DVI output
#setenv bootargs ‘console=ttyO2,115200n8 androidboot.console=ttyO2 mem=512M root=/dev/mmcblk0p2 rw rootfstype=ext3 rootdelay=1 init=/init ip=off omap_vout.vid1_static_vrfb_alloc=y omapdss.def_disp=dvi vram=32M omapfb.mode=dvi:1280x720MR-32 omapfb.vram=0:16M mpurate=1000‘
# Pantherboard LCD output
setenv bootargs ‘console=ttyO2,115200n8 androidboot.console=ttyO2 mem=512M root=/dev/mmcblk0p2 rw rootfstype=ext3 rootdelay=1 init=/init ip=off omap_vout.vid1_static_vrfb_alloc=y omapdss.def_disp=lcd omapfb.mode=lcd:800x480MR-32 vram=8M omapfb.vram=0:8M mpurate=1000‘

將no_console_suspend加上去到boot 參數後就好了

setenv bootargs ‘console=ttyO2,115200n8 androidboot.console=ttyO2 mem=512M root=/dev/mmcblk0p2 rw rootfstype=ext3 rootdelay=1 init=/init ip=off omap_vout.vid1_static_vrfb_alloc=y omapdss.def_disp=lcd omapfb.mode=lcd:800x480MR-32 vram=8M omapfb.vram=0:8M mpurate=1000 no_console_suspend‘

如果是OMAP4 APM的話,請修改Kernel 參數的所在檔案即可(在U-boot Source code中)

這個是基本的參數,所以在Android或Linux上都可以使用。 kernel把console suspend掉以後, 不管裡面出了什麼事情, 在Console上都看不到。 而使用這個參數後,大部分在suspend/resume時候的死機都可以通過Console看到kernel Panic的信息, 這樣我們才會知道是哪裡出了問題。 因為有的時候resume出錯, 或者suspend到很後面出錯的console不加這個參數都看不到。

但這個參數在TI OMAP3/OMAP4/AM37x/DM37x有可能造成有時Suspend 完當掉或是resume 失敗的問題,假如已經抓到問題在那的時候,您就可以將這個參數Disable,不然很可能就會Debug不下去。

initcall_debug

這個同樣kernel參數,使用的時機是,當我們不知道是那個driver在suspend/resume過程中出錯的時候,可以使用這個參數來找出問題所在。在下完這個參數後,Kernel在suspend時,會將每個driver或task的狀況report出來。我們可以藉由這些information,Check 在suspend時,每個task和driver是否已經完成進suspend 的相關準備工作…

打開這個參數的方法有二種
一種是在console下Command,啟動這個function…

echo 1 > /sys/module/kernel/parameters/initcall_debug
echo 9 > /proc/sys/kernel/printk

其中上面的第一條命令是打開initcall_debug, 這個是所有的kernel都會有的。

而第二條命令是要提高kernel message 級別,因為initcall的這些信息都是KERN_DEBUG級別的, 所以需要提高printk的級別才可以看到, 要不然suspend/resume的時候掛了,你就沒有機會看到這些信息了。

另一種啟動方法是寫在kernel的啟動參數下,就可以了。

setenv bootargs ‘console=ttyO2,115200n8 androidboot.console=ttyO2 mem=512M root=/dev/mmcblk0p2 rw rootfstype=ext3 rootdelay=1 init=/init ip=off omap_vout.vid1_static_vrfb_alloc=y omapdss.def_disp=lcd omapfb.mode=lcd:800x480MR-32 vram=8M omapfb.vram=0:8M mpurate=1000 initcall_debug no_console_suspend‘

同樣的,這個參數也有可能造成AM37x/DM37x/OMAP4 APM發生進suspend當掉的問題。所以一旦知道問題所在,麻煩請將這個參數Disable掉。

suspend_test

這個方法可以用rtc這種軟件的方式來做循環的suspend/resume, 儘管對於Android這樣並不是很足夠, (還要再模擬一個POWER_KEY上去才夠), 但是對於測試Driver的穩定性, 還是有一定用處的。不要認為suspend了幾次可以,那麼就可以通過幾千次的測試。這個suspend是5秒鐘用RTC喚醒,然後回到Android後5秒鐘又會自動睡下去,但是對於通用Linux,你可以寫個script來讓他起來一會再睡下去,或許這個工具比較有用rtcwakeup(google rtcwakeup)。

使用方法:
編譯一個有這個功能的kernel, make menuconfig 以後選上

CONFIG_PM_DEBUG=y
CONFIG_PM_TEST_SUSPEND=y

這兩個選項,燒寫新的kernel,然後打開你需要測試的Device, 比如WIFI,3G

echo "core" > /sys/power/pm_test
echo "mem" > /sys/power/state

這樣, 它就會循環休眠和喚醒了。

wakelock

Android和Linux在Power Management相關的最大的就是wakelock機制的有無。Android有時候會碰到suspend進不去,或者suspend到最後又莫名奇妙的wake up的問題。這些都有可能是wakelock引起的,或者說是wakelock的使用者引起的。怎麼fine tune呢,使用Console在Android 系統下設定:

echo 15 > /sys/module/wakelock/parameters/debug_mask
echo 15 > /sys/module/userwakelock/parameters/debug_mask

15是代表16進制的F, 在wakelock裡面就是把所有的debug信息打開, 起碼現在是這樣設定的。如果以後不夠用了,可能就會改成255.
這樣你能看到kernel和frameworks層對於wakelock的操作、申請及釋放。這樣看申請和釋放成對否就可以了。
注意: wakelock有一種是timeout的,就是說多少毫秒以後,會自動釋放,對於這些wakelock,申請和釋放可能是不成對的。

power.0

有時看到系統suspend到了最後, 然後遇到power.0後suspend失敗,然後整個系統又resume回來。這個是android專有的,因為power.0是android註冊到suspend最後的一個行程, 它會在CPU進入suspend之前檢查一下有沒有wakelock存在, 如果這時候還有沒有釋放的wakelock, 那麼它會return -EBUSY然後導致整個suspend失敗。 Check這個問題的方法就是把上面wakelock的debug信息打開,然後看看是哪個去申請了wakelock,然後Release它。

這個錯誤的錯誤信息大概是這樣的:

    pm_noirq_op(): platform_pm_suspend_noirq+0x0/0x38 returns -11
    PM: Device power.0 failed to suspend late: error -11

earlysuspend

在android裡面中另外一個和Power Management有相關的機制叫earlysuspend, 同樣可以打開debug message,用來做Android earlysuspend debug之用:

echo 15 > /sys/module/earlysuspend/parameters/debug_mask

來把相關的debug信息印出來, 例如那個earlysuspend要被call之類的。

suspend/resume 時間 fine tune

有的時候你要調試suspend/resume的時間太慢的問題。 一種方法是用initcall_debug, 然後把printk的時間戳打上, 然後看那個process最慢,再來Check原因是什麼
我有一個patch,專門用來調試這個問題的,但是upstream不接受, 說非要用這種折磨人的方法才行, 但是如果你想用可以下下來打上去用一下。

地址在這裡:http://www.spinics.net/lists/linux-pm/msg24063.html

用法是, 打上這個PATCH以後, 在KERNEL裡面選擇上PM_DEBUG, SUSPEND_DEVICE_TIME_DEBUG 這兩個選項。

然後

   echo 微秒> /sys/power/device_suspend_time_threshold

比如

   echo 50000 > /sys/power/device_suspend_time_threshold

注意這裡是微秒哦。 。 。 它會把在suspend/resume的時候慢的那些driver打出來,然後你去幹掉它。 。

时间: 2024-07-29 08:12:34

如何在Android 或Linux 下,做Suspend /Resume 的Debug【转】的相关文章

Linux下做软RAID

1.查看有多少块硬盘可用#fdisk -l嗯,一般而言,留下系统盘不动,其它的盘如果大小相同的话,统统合起来做一个raid. 2.决定做什么类型的raid.raid-0.raid-1.raid-5?如果有三块一样大小的盘(或者更多),那么极力推荐raid-5.否则请根据实际情况选择raid-0或者raid-1 3.卸载已挂载的数据盘首先查看下,要做raid的几块盘是不是已经被挂载过了#mount如果有,那么挨个删除数据.然后用umount卸载.然后,还有,打开/etc/fstab,注释掉那些刚卸

如何在windows下和linux下获取文件(如exe文件)的详细信息和属性

程序员都很懒,你懂的! 最近在项目开发中,由cs开发的exe的程序,需要自动升级,该exe程序放在linux下,自动升级时检测不到该exe程序的版本号信息,但是我们客户端的exe程序需要获取服务器上新程序的版本号信息.最后由我用java实现linux上exe文件的版本号读取功能.下面是详细代码: package com.herman.utils; import java.io.File; import java.io.FileNotFoundException; import java.io.I

在linux下做RAID1试验

RAID1试验 试验要求: 两块磁盘做raid1 破坏其中一个硬盘(做删除操作) 恢复破坏的磁盘及数据                             实现过程: 1.准备linux,配置IP,链接putty 2.查看系统信息 [[email protected]~]# uname -a Linuxlocalhost.localdomain 2.6.32-358.el6.x86_64 #1 SMP Tue Jan 29 11:47:41 EST 2013x86_64 x86_64 x86

Linux下做磁盘阵列和各种热备份

磁盘阵列分为: 具有冗余功能的阵列:raid0 raid4 raid5 raid6 raid10 raid01.... 读写速度优势的阵列:raid1 raid4 raid5 raid6 raid10 raid01.... 怎么制作磁盘阵列呢,分别列举: 1.具有冗余功能的阵列raid0 1.1至少需要两块磁盘,sdb和sdc,从两个磁盘中分别划出一个分区分别为:sdb1和sdc1, 1.2在分区的时候需要改变分区号-fd,然后w退出. 1.3制作raid0,在制作该磁盘阵列之前,需要安装mda

[Android Memory] Linux下malloc函数和OOM Killer

http://www.linuxidc.com/Linux/2010-09/28364.htm Linux下malloc函数主要用来在用户空间从heap申请内存,申请成功返回指向所分配内存的指针,申请失败返回NULL.默认情况下,Linux内核使用“乐观的”分配内存策略,首先粗略估计系统可使用的内存数,然后分配内存,但是在使用的时候才真正把这块分配的内存给你.这样一来,即使用malloc申请内存没有返回NULL,你也不一定能完全使用这块内存,特别是在一次或连续多次申请很多内存的时候. 如果一直连

[杂谈]: Android studio linux 下比 windows 下流畅的多,还是用 linux 或 mac 吧; Google developer conference 2016

1.谷歌developers 有.cn的网址了,不用科学上网查资料了. https://developers.google.cn/ 2.在试了windows 下的android studio 后,实在忍不了了,太卡了,4G的内存直接90%.(哎,该换电脑了) 在 ubuntukylin下试了下,流畅多了. http://www.ubuntukylin.com/ 3.连接手机很方便,插上后自动提示下载对应的组件,速度也很快. 4.谷歌大会很赞的,增长了不少见识. 5.深度学习领域很棒,图像识别.

linux下做图工具——graphviz安装配置

今天给大家介绍一个很好的流程图制作工具--graphviz 其安装方法很多,可以通过deb包,源码,以及命令安装 本人使用的源码安装,在这里下载其源码包,之后依次输入: ./configure make make install (理论上是没有错误的) 当然还有一个最简单的方法是输入:apt-get install graphviz 直接安装(没有亲测过,应该是可以的) 在安装好了之后就开始了配置(这里由于技术有限,没办法陪的和大牛一样好,请见谅) 由于本人使用的是vim所以这里只能介绍一下vi

Android和Linux的关系

①.Android采用Linux作为内核 ②.Android对Linux内核做了相应的修改,使Linux适应在移动设备上使用 ③.Android一开始是Linux的一个分支,由于无法并入Linux的主开发树,被从开发树中移除 一.Android是继承于Linux Android是在Linux内核基础之上运行,提供的核心系统服务包括安全.内存管理.进程管理.组网组和驱动模型等内容,内核部分相当于介于硬件层和系统中其他软件组之间的一个抽象层次.所以,严格来说不算是Linux操作系统.由于Androi

Linux 下安装 Redis 服务器

本文简单介绍了 Linux 下安装 Redis 服务器的步骤,同时简要介绍服务器的配置.启动以及状态检测.另外还介绍了 32 位 CentOS 下安装 Redis 时遇到的一些问题的解决.        一. 查看 Linux 相关信息        版本查看cat /etc/issueCentOS release 5.5 (Final)        位数查看getconf LONG_BIT32        二. 安装 tcl        先装好 tcl,不然 redis 的 make t