SBA of anr/watchdog timeout

anr和wathcdog timeout的分析很相似,主要是在bugreport/anr history中分析call stack过程.
其区别就是:watchdog timeout是从进程system_server(线程不固定,可以为main,foregroud等)为切点,anr是从app进程main线程为切入点.
下以watchdog案例分析.

1.查看是否发生anr/watchdog timeout,及其时间点
1.1 anr
发生在app进程
(1)main log中搜索"am_anr"
(2)bugreport中搜索"ANR in"
这里能知道是“哪个APP”发生ANR

1.2 watchdog timeout
发生在system_server进程
(1)main log中搜索"watchdog"
(2)bugreport中搜索"WATCHDOG KILLING SYSTEM PROCESS"
这里知道system_server进程的"哪个线程"发生watchdog

2.查看"上层"阻塞在哪个线程及哪个函数
2.1 线程
(1) anr
一定是阻塞在APP的main线程
(2)watchdog timeout
从"WATCHDOG KILLING SYSTEM PROCESS"这里能得到system_server blocked的线程.比如main,foregroud线程
[
#3928-12.3-wt_logs\3928-12.3-wt_logs\log_20181203110024\bugreport.txt
12-03 10:58:16.034 1000 2934 3945 W Watchdog: *** WATCHDOG KILLING SYSTEM PROCESS: Blocked in handler on main thread (main)  >>>>这个刚好是main线程
]

2.2 函数
对于Video stability,一般是调用MediaPlayer/MediaRecorder Java API,然后进行binder IPC.

搜索Cmd line: system_server或者APP name,可能出现多个,找时间点附近的call stack
[
#3928-12.3-wt_logs\3928-12.3-wt_logs\log_20181203110024\anr\anr_2018-12-03-10-57-21-569
----- pid 2934 at 2018-12-03 10:57:21 -----
Cmd line: system_server
"main" prio=5 tid=1 Native
| group="main" sCount=1 dsCount=0 flags=1 obj=0x729aa710 self=0x73064c2a00
| sysTid=2934 nice=-2 cgrp=default sched=0/0 handle=0x738b2769a8
...
native: #00 pc 000000000006a50c /system/lib64/libc.so (__ioctl+4)
native: #01 pc 0000000000024478 /system/lib64/libc.so (ioctl+136)
native: #02 pc 00000000000549e8 /system/lib64/libbinder.so (android::IPCThreadState::talkWithDriver(bool)+256)      >>>>
...
native: #07 pc 000000000009b738 /system/lib64/libmedia.so (android::MediaPlayer::setDataSource(int, long, long)+292) >>>>
native: #08 pc 00000000000401e0 /system/lib64/libmedia_jni.so (???)
native: #09 pc 000000000073da08 /system/framework/arm64/boot-framework.oat (Java_android_media_MediaPlayer__1setDataSource__Ljava_io_FileDescriptor_2JJ+168)
at android.media.MediaPlayer._setDataSource(Native method)  >>>>
...
at android.media.Ringtone.setUri(Ringtone.java:307)

>>>>这个是调用MediaPlayer::setDataSource,之后看到IPCThreadState::talkWithDriver,就表示在做binder IPC.
]

3.查看"上层"binder IPC到哪个进程及哪个线程
查看binder transaction信息,搜索“from <process1>:<thread1>“ to <process2>:<thread2>
正常全面的log,应该是有binder transaction的,如下;但有些customer log中无此信息,那就得知道MediaPlayer或者MediaRecorder flow的进程关系.

<
#BinderTraces.txt
proc 2934
context binder
thread 2934: l 10 need_return 0 tr 0
outgoing transaction 90748022: ffffffc033ad7980 from 2934:2934 to 2366:1316 code 1 flags 10 pri 0:118 r1             >>>>

这里是<process2>:<thread2>为2366:1316
>

4.查看"第二层"进程阻塞在哪个线程及哪个函数(通常是mediaserver进程)
4.1 找哪个线程是等锁,哪个线程是持有锁 => Mutex::Autolock lock(mLock);
call stack中函数下一个就是lock,说明是等锁
call stack中函数调用别的函数,说明是持有锁

[
----- pid 2366 at 2018-12-03 10:57:27 -----
Cmd line: /system/bin/mediaserver

//(No)sysTid=1316 is waiting for lock which is hold by sysTid=25863
"Binder:2366_A" sysTid=1316
#00 pc 0001901c /system/lib/libc.so (syscall+28)
#01 pc 00048145 /system/lib/libc.so (__pthread_mutex_lock_with_timeout(pthread_mutex_internal_t*, bool, timespec const*)+164)                                    >>>>等MediaPlayerService锁
#02 pc 0003e64f /system/lib/libmediaplayerservice.so (android::MediaPlayerService::create(android::sp<android::IMediaPlayerClient> const&, audio_session_t)+170) >>>>
...
]

//(No) sysTid=25863 is waiting for lock which is hold by sysTid=9520
"Binder:2366_B" sysTid=25863
#00 pc 0001901c /system/lib/libc.so (syscall+28)
#01 pc 00048145 /system/lib/libc.so (__pthread_mutex_lock_with_timeout(pthread_mutex_internal_t*, bool, timespec const*)+164)
#02 pc 0004c989 /system/lib/libmediaplayerservice.so (android::StagefrightRecorder::dump(int, android::Vector<android::String16> const&) const+28) >>>>>等StagefrightRecorder锁
#03 pc 0003eeab /system/lib/libmediaplayerservice.so (android::MediaPlayerService::dump(int, android::Vector<android::String16> const&)+362)      
#04 pc 0003f445 /system/lib/libmediaplayerservice.so (_ZThn4_N7android18MediaPlayerService4dumpEiRKNS_6VectorINS_8String16EEE+4)                   >>>>持有MediaPlayerService锁

>>>>以上2个线程sysTid=25863,1316:MediaPlayerService是单一实例,所以mLock是所有calling client的公有.只要MediaPlayerServic某一函数有在用锁,其他想用锁的限制就需要等待

//(No)sysTid=4333 is waiting for MediaCodec Message reply
"Binder:2366_8" sysTid=9520
#00 pc 0001901c /system/lib/libc.so (syscall+28)
#01 pc 0004738b /system/lib/libc.so (__pthread_cond_timedwait(pthread_cond_internal_t*, pthread_mutex_t*, bool, timespec const*)+102)
...
#05 pc 000d890b /system/lib/libstagefright.so (android::MediaCodec::init(android::AString const&, bool, bool)+1306)
#06 pc 000d8ba5 /system/lib/libstagefright.so (android::MediaCodec::CreateByComponentName(android::sp<android::ALooper> const&, android::AString const&, int*, int, unsigned int)+132)
#07 pc 000e5657 /system/lib/libstagefright.so (android::MediaCodecSource::initEncoder()+290)
#08 pc 000e4715 /system/lib/libstagefright.so (android::MediaCodecSource::Create(android::sp<android::ALooper> const&, android::sp<android::AMessage> const&, android::sp<android::MediaSource> const&, android::sp<android::PersistentSurface> const&, unsigned int)+124)
#09 pc 0004b631 /system/lib/libmediaplayerservice.so (android::StagefrightRecorder::setupVideoEncoder(android::sp<android::MediaSource> const&, android::sp<android::MediaCodecSource>*)+984)
#10 pc 0004a0e5 /system/lib/libmediaplayerservice.so (android::StagefrightRecorder::setupMPEG4orWEBMRecording()+148)
#11 pc 0004a837 /system/lib/libmediaplayerservice.so (android::StagefrightRecorder::start()+46)                                              >>>>持有StagefrightRecorder锁

>>>>以上2个线程sysTid=25863,9520:StagefrightRecorder::dump是对所有StagefrightRecorder对象进行dump,我们看此时有没有StagefrightRecorder在做事件.

4.2 找哪个线程是等条件,哪个线程是发信号
等条件,一般这个函数是异步处理=>mCondition.wait(mLock);
比如NuPlayerDriver::reset

[
//(No)sysTid=3968 is waiting condition which need signaled by sysTid=24410
"Binder:2366_2" sysTid=3968
#00 pc 0001901c /system/lib/libc.so (syscall+28)
#01 pc 0004738b /system/lib/libc.so (__pthread_cond_timedwait(pthread_cond_internal_t*, pthread_mutex_t*, bool, timespec const*)+102)        >>>>
#02 pc 0005c3ff /system/lib/libmediaplayerservice.so (android::NuPlayerDriver::reset()+306)                                                  >>>>等NuPlayerDriver条件,要NuPlayerDriver::reset异步处理完成后signal这个condition
#03 pc 000415f1 /system/lib/libmediaplayerservice.so (android::MediaPlayerService::Client::reset()+36)

//(No)sysTid=4333 is waiting for MediaCodec Message reply
"NPDecoder" sysTid=24410
#00 pc 0001901c /system/lib/libc.so (syscall+28)
#01 pc 0004738b /system/lib/libc.so (__pthread_cond_timedwait(pthread_cond_internal_t*, pthread_mutex_t*, bool, timespec const*)+102)
#02 pc 00010c55 /system/lib/libstagefright_foundation.so (android::ALooper::awaitResponse(android::sp<android::AReplyToken> const&, android::sp<android::AMessage>*)+92)
#03 pc 00012399 /system/lib/libstagefright_foundation.so (android::AMessage::postAndAwaitResponse(android::sp<android::AMessage>*)+136)
#04 pc 000d9401 /system/lib/libstagefright.so (android::MediaCodec::PostAndAwaitResponse(android::sp<android::AMessage> const&, android::sp<android::AMessage>*)+20)
#05 pc 000dbf3f /system/lib/libstagefright.so (android::MediaCodec::flush()+82)                          >>>>MediaCodec::flush抛message并等到response
#06 pc 00057c79 /system/lib/libmediaplayerservice.so (android::NuPlayer::Decoder::doFlush(bool)+40)
#07 pc 00057d01 /system/lib/libmediaplayerservice.so (android::NuPlayer::Decoder::onFlush()+20)          >>>>NuPlayerDriver::reset会走到NuPlayer::Decoder::onFlush
#08 pc 00056469 /system/lib/libmediaplayerservice.so (android::NuPlayer::Decoder::onMessageReceived(android::sp<android::AMessage> const&)+464)
]

4.3 ALooper线程
技巧1:
    看见哪里有message抛出,要去看它的ALooper线程在做什么?(可能不是处理当前的消息,而是之前的消息就没处理完)
技巧2:
    在mediaserver进程中,能看到很多相同名字的ALooper线程,因为可能同时存在多种操作(MetadataRetriever,Recorder,Playback).若ALooper在干相同的事件,得知他们是共性的,可认为不是阻塞的根本点.

4.3.1 All ALooper of media.player service when do Playback
(1)NuPlayer ALooper name:
NuPlayerDriver.cpp => NuPlayerDriver    1
(2)NuPlayer::GenericSource ALooper name:
GenericSource.cpp => generic    1
(3)NuPlayerRendere ALooper name:
NuPlayer.cpp => NuPlayerRendere    1
(4)NuPlayerDecoder ALooper name:
NuPlayerDecoderBase.cpp => NPDecoder    2
(5)MediaCodec ALooper name:
NuPlayerDecoder.cpp=>NPDecoder-CL     2
(6)ACodec ALooper name:
(video new ALooper)MediaCodec.cpp => CodecLooper    1
(audio ALooper same as MediaCodec)NuPlayerDecoder.cpp => NPDecoder-CL 1

4.3.1 All ALooper of media.player service when do Recorder
(1)MediaCodecSource ALooper name:
StagefrightRecorder.cpp => recorder_looper    2
(2)MediaCodecSource::Puller ALooper name:
MediaCodecSource.cpp => pull_looper    2
(3)MediaCodec ALooper name:
MediaCodecSource.cpp => codec_looper    2
(4)ACodec ALooper name:
(video new ALooper)MediaCodec.cpp => CodecLooper 1
(audio ALooper same as MediaCodec)NuPlayerDecoder.cpp => codec_looper 1

PS:
MediaCodec ALooper name:
NdkMediaCodec.cpp => NDK MediaCodec_looper

[
//(No)sysTid=4333 is waiting for MediaCodec Message reply
"Binder:2366_5" sysTid=4333
#00 pc 0001901c /system/lib/libc.so (syscall+28)
#01 pc 0004738b /system/lib/libc.so (__pthread_cond_timedwait(pthread_cond_internal_t*, pthread_mutex_t*, bool, timespec const*)+102)
#02 pc 00010c55 /system/lib/libstagefright_foundation.so (android::ALooper::awaitResponse(android::sp<android::AReplyToken> const&, android::sp<android::AMessage>*)+92)
#03 pc 00012399 /system/lib/libstagefright_foundation.so (android::AMessage::postAndAwaitResponse(android::sp<android::AMessage>*)+136)
#04 pc 000d9401 /system/lib/libstagefright.so (android::MediaCodec::PostAndAwaitResponse(android::sp<android::AMessage> const&, android::sp<android::AMessage>*)+20)
#05 pc 000d890b /system/lib/libstagefright.so (android::MediaCodec::init(android::AString const&, bool, bool)+1306)              >>>>MediaCodec::init抛消息
#06 pc 000d8ba5 /system/lib/libstagefright.so (android::MediaCodec::CreateByComponentName(android::sp<android::ALooper> const&, android::AString const&, int*, int, unsigned int)+132)
#07 pc 000f8f0f /system/lib/libstagefright.so (android::StagefrightMetadataRetriever::getFrameAtTime(long long, int, int, bool)+5266)
#08 pc 00047eff /system/lib/libmediaplayerservice.so (android::MetadataRetrieverClient::getFrameAtTime(long long, int, int, bool)+98) >>>>MetadataRetriever

//(No)sysTid=9520 is waiting for MediaCodec Message reply
"Binder:2366_8" sysTid=9520
#00 pc 0001901c /system/lib/libc.so (syscall+28)
#01 pc 0004738b /system/lib/libc.so (__pthread_cond_timedwait(pthread_cond_internal_t*, pthread_mutex_t*, bool, timespec const*)+102)
...
#05 pc 000d890b /system/lib/libstagefright.so (android::MediaCodec::init(android::AString const&, bool, bool)+1306)              >>>>MediaCodec::init抛消息
#06 pc 000d8ba5 /system/lib/libstagefright.so (android::MediaCodec::CreateByComponentName(android::sp<android::ALooper> const&, android::AString const&, int*, int, unsigned int)+132)
#07 pc 000e5657 /system/lib/libstagefright.so (android::MediaCodecSource::initEncoder()+290)
#08 pc 000e4715 /system/lib/libstagefright.so (android::MediaCodecSource::Create(android::sp<android::ALooper> const&, android::sp<android::AMessage> const&, android::sp<android::MediaSource> const&, android::sp<android::PersistentSurface> const&, unsigned int)+124)
#09 pc 0004b631 /system/lib/libmediaplayerservice.so (android::StagefrightRecorder::setupVideoEncoder(android::sp<android::MediaSource> const&, android::sp<android::MediaCodecSource>*)+984)
#10 pc 0004a0e5 /system/lib/libmediaplayerservice.so (android::StagefrightRecorder::setupMPEG4orWEBMRecording()+148)
#11 pc 0004a837 /system/lib/libmediaplayerservice.so (android::StagefrightRecorder::start()+46)                                   >>>>Recorder

//(No)sysTid=17822 is waiting for MediaCodec Message reply
"NPDecoder" sysTid=17822
#00 pc 0001901c /system/lib/libc.so (syscall+28)
#01 pc 0004738b /system/lib/libc.so (__pthread_cond_timedwait(pthread_cond_internal_t*, pthread_mutex_t*, bool, timespec const*)+102)
...
#05 pc 000d890b /system/lib/libstagefright.so (android::MediaCodec::init(android::AString const&, bool, bool)+1306)             >>>>MediaCodec::init抛消息
#06 pc 000d832b /system/lib/libstagefright.so (android::MediaCodec::CreateByType(android::sp<android::ALooper> const&, android::AString const&, bool, int*, int, unsigned int)+134)
#07 pc 00057337 /system/lib/libmediaplayerservice.so (android::NuPlayer::Decoder::onConfigure(android::sp<android::AMessage> const&)+278)
#08 pc 0002be9f /system/lib/libavenhancements.so (android::ExtendedNuPlayerDecoder::onConfigure(android::sp<android::AMessage> const&)+90)   >>>>Playback

>>>>>以上3个ALooper线程sysTid=4333,9520,17822是共性的,都是MediaCodec::init在post message.

//MediaCodec ALooper
"NPDecoder-CL" sysTid=24411
  #00 pc 0001901c  /system/lib/libc.so (syscall+28)
  #01 pc 0004738b  /system/lib/libc.so (__pthread_cond_timedwait(pthread_cond_internal_t*, pthread_mutex_t*, bool, timespec const*)+102)
  #02 pc 000108ed  /system/lib/libstagefright_foundation.so (android::ALooper::loop()+392)
  #03 pc 0000d24b  /system/lib/libutils.so (android::Thread::_threadLoop(void*)+274)
  #04 pc 000479ef  /system/lib/libc.so (__pthread_start(void*)+22)
  #05 pc 0001b2ed  /system/lib/libc.so (__start_thread+32)

4.4 Binder IPC线程
技巧2:在mediaserver进程主要查询点在2种情况:
    看谁在做事件:
      (1)某个线程是否存在死锁
      (2)某个线程是否做binder IPC到media.codec进程.此需要继续去media.codec进程.
      
//ACodec ALooper  
//=>V1_0::BpHwOmx::_hidl_allocateNode
"NPDecoder-CL" sysTid=17823
#00 pc 000490a0 /system/lib/libc.so (__ioctl+8)
#01 pc 0001e121 /system/lib/libc.so (ioctl+32)
#02 pc 00010107 /system/lib/libhwbinder.so (android::hardware::IPCThreadState::talkWithDriver(bool)+202)
#03 pc 00010bd7 /system/lib/libhwbinder.so (android::hardware::IPCThreadState::waitForResponse(android::hardware::Parcel*, int*)+246)
#04 pc 0000e5a1 /system/lib/libhwbinder.so (android::hardware::BpHwBinder::transact(unsigned int, android::hardware::Parcel const&, android::hardware::Parcel*, unsigned int, std::__1::function<void (android::hardware::Parcel&)>)+36)
#05 pc 0003471d /system/lib/android.hardware.media.omx@1.0.so (android::hardware::media::omx::V1_0::BpHwOmx::_hidl_allocateNode(android::hardware::IInterface*, android::hardware::details::HidlInstrumentor*, android::hardware::hidl_string const&, android::sp<android::hardware::media::omx::V1_0::IOmxObserver> const&, std::__1::function<void (android::hardware::media::omx::V1_0::Status, android::sp<android::hardware::media::omx::V1_0::IOmxNode> const&)>)+380)
#06 pc 000350f9 /system/lib/android.hardware.media.omx@1.0.so (android::hardware::media::omx::V1_0::BpHwOmx::allocateNode(android::hardware::hidl_string const&, android::sp<android::hardware::media::omx::V1_0::IOmxObserver> const&, std::__1::function<void (android::hardware::media::omx::V1_0::Status, android::sp<android::hardware::media::omx::V1_0::IOmxNode> const&)>)+48)
#07 pc 0004ff3f /system/lib/libmedia.so (android::hardware::media::omx::V1_0::utils::LWOmx::allocateNode(char const*, android::sp<android::IOMXObserver> const&, android::sp<android::IOMXNode>*)+102)>>>>
#08 pc 0009df2f /system/lib/libstagefright.so (android::ACodec::UninitializedState::onAllocateComponent(android::sp<android::AMessage> const&)+1010)
#09 pc 0009da7f /system/lib/libstagefright.so (android::ACodec::UninitializedState::onMessageReceived(android::sp<android::AMessage> const&)+150)
<
proc 2366
context hwbinder
outgoing transaction 90130963: ffffffc013e92380 from 2366:17823 to 2389:23560 code 2 flags 10 pri 0:118 r1
>

5.查看"第三层"进程阻塞在哪个线程及哪个函数(通常是media.codec进程)
一般在mediaserver进程中会binder IPC到media.codec进程  (当然mediaserver中也可能存在死锁,就没到media.codec了)
这里看media.codec中所有的call back,看谁等锁,谁持有锁;
找到最终的持有锁者

[
PS:2018-12-03的media.codec进程中call back未发现有线程在做事件,以下是另外时间点2018-12-26的media.codec在做事件(mediaserver一样的block)

#\log_20181226044226\android_log\wt_logs\logcat-log
----- pid 2273 at 2018-12-26 16:30:23 -----
Cmd line: media.codec

//=>V1_0::BnHwOmx::_hidl_allocateNode => V1_0::implementation::Omx::allocateNode is waiting for lock
"omx@1.0-service" sysTid=11726
#00 pc 0001901c /system/lib/libc.so (syscall+28)
#01 pc 00048145 /system/lib/libc.so (__pthread_mutex_lock_with_timeout(pthread_mutex_internal_t*, bool, timespec const*)+164)
#02 pc 0004001d /system/lib/libstagefright_omx.so (android::hardware::media::omx::V1_0::implementation::Omx::allocateNode(android::hardware::hidl_string const&, android::sp<android::hardware::media::omx::V1_0::IOmxObserver> const&, std::__1::function<void (android::hardware::media::omx::V1_0::Status, android::sp<android::hardware::media::omx::V1_0::IOmxNode> const&)>)+36)
#03 pc 000358b5 /system/lib/android.hardware.media.omx@1.0.so (android::hardware::media::omx::V1_0::BnHwOmx::_hidl_allocateNode(android::hidl::base::V1_0::BnHwBase*, android::hardware::Parcel const&, android::hardware::Parcel*, std::__1::function<void (android::hardware::Parcel&)>)+360)
...

//=>V1_0::implementation::Omx::freeNode is waiting for lock
"omx@1.0-service" sysTid=30255
#00 pc 0001901c /system/lib/libc.so (syscall+28)
#01 pc 00048145 /system/lib/libc.so (__pthread_mutex_lock_with_timeout(pthread_mutex_internal_t*, bool, timespec const*)+164)
#02 pc 00040c37 /system/lib/libstagefright_omx.so (android::hardware::media::omx::V1_0::implementation::Omx::freeNode(android::sp<android::OMXNodeInstance> const&)+38)
#03 pc 00032fcd /system/lib/libstagefright_omx.so (android::OMXNodeInstance::freeNode()+468)
#04 pc 00047217 /system/lib/libstagefright_omx.so (android::hardware::media::omx::V1_0::implementation::TWOmxNode::freeNode()+10)
#05 pc 00046123 /system/lib/android.hardware.media.omx@1.0.so (android::hardware::media::omx::V1_0::BnHwOmxNode::_hidl_freeNode(android::hidl::base::V1_0::BnHwBase*, android::hardware::Parcel const&, android::hardware::Parcel*, std::__1::function<void (android::hardware::Parcel&)>)+98)

//=>V1_0::implementation::Omx::serviceDied  is waiting for lock
"omx@1.0-service" sysTid=7081
#00 pc 0001901c /system/lib/libc.so (syscall+28)
#01 pc 00048145 /system/lib/libc.so (__pthread_mutex_lock_with_timeout(pthread_mutex_internal_t*, bool, timespec const*)+164)
#02 pc 00040a8f /system/lib/libstagefright_omx.so (android::hardware::media::omx::V1_0::implementation::Omx::serviceDied(unsigned long long, android::wp<android::hidl::base::V1_0::IBase> const&)+26)
#03 pc 000211d1 /system/lib/vndk-sp/libhidltransport.so (android::hardware::hidl_binder_death_recipient::binderDied(android::wp<android::hardware::IBinder> const&)+68)
#04 pc 0000e8e9 /system/lib/vndk-sp/libhwbinder.so (android::hardware::BpHwBinder::reportOneDeath(android::hardware::BpHwBinder::Obituary const&)+80)
#05 pc 0000e86b /system/lib/vndk-sp/libhwbinder.so (android::hardware::BpHwBinder::sendObituary()+100)
#06 pc 0001060d /system/lib/vndk-sp/libhwbinder.so (android::hardware::IPCThreadState::executeCommand(int)+656)
#07 pc 0001027d /system/lib/vndk-sp/libhwbinder.so (android::hardware::IPCThreadState::getAndExecuteCommand()+116)
#08 pc 00010817 /system/lib/vndk-sp/libhwbinder.so (android::hardware::IPCThreadState::joinThreadPool(bool)+38)
#09 pc 000175ed /system/lib/vndk-sp/libhwbinder.so
#10 pc 0000d1c9 /system/lib/vndk-sp/libutils.so (android::Thread::_threadLoop(void*)+144)
#11 pc 000479ef /system/lib/libc.so (__pthread_start(void*)+22)
#12 pc 0001b2ed /system/lib/libc.so (__start_thread+32)

>>>>
"omx@1.0-service" sysTid=11726,"omx@1.0-service" sysTid=21110,"omx@1.0-service" sysTid=13011
以上的都是等android::hardware::media::omx::V1_0::implementation锁,未看出被谁持有
]

6.看最终的持有锁者的进程有没有更早的blocked时间点
因为可能此block发生在很早之前,但因为没app或system_server通信下来,所以在晚点时间才出现anr/watchdog timeout
可以在怀疑的函数前后加log:一是可确认是这里没往下走,二是能找到精确时间点

7.在main log和kernel log中时间点附近有无异常

SBA of anr/watchdog timeout相关推荐

  1. Win10蓝屏win32k power watchdog timeout 蓝屏代码0x0000019C

    环境: Win 10专业版 联想E14 问题描述: Win10蓝屏0x0000019C win32k power watchdog timeout 解决方案: WIN32K_POWER_WATCHDO ...

  2. Watchdog机制原理

    Watchdog机制 1.什么是SWT: Softwere Watchdog Timeout,顾名思义就是软件超时监控狗. Watchdog.java 位于frameworks/base/servic ...

  3. Android 性能优化系列:ANR 触发原理与分析

    文章目录 什么是 ANR? ANR 发生场景 系统对 ANR 的捕捉原理 如何分析 ANR traces.txt 信息概览 日志分析思路 ANR 日志准备(traces.txt + mainlog) ...

  4. PostgreSQL 来自欧罗巴Patroni watchdog 汪汪汪 5

    已经写到了第五期, 最近深感学习一件东西,可以和秋风扫落叶的一样的学习和理解,也可以和冰血暴一样的学习了理解,决定用那种方式学习,主要依靠 1  这门技术是临时使用还是基础性的常识 2  这么技术是处 ...

  5. Android 输入系统 ANR机制的设计与实现

    /   今日科技快讯   / 据报道,字节跳动将于今年下半年在国内推出一款音乐流媒体产品,目前该产品已进入关键开发阶段,产品名称暂定"飞乐",项目内部代号为"luna&q ...

  6. 反思|Android 输入系统 ANR机制的设计与实现

    反思 系列博客是我的一种新学习方式的尝试,该系列起源和目录请参考 这里 . 概述 对于Android开发者而言,ANR是一个老生常谈的问题,站在面试者的角度,似乎说出 「不要在主线程做耗时操作」 就算 ...

  7. 瑞昱rtl819x-SDK-v3.4.14b的watchdog分析

    watchdog 看门狗,又叫watchdog timer,是一个定时器电路,一般有一个输入,叫喂狗或踢狗:一个输出到MCU 的 RST 端,MCU 正常工作的时候,每隔一段时间输出一个信号到喂狗端, ...

  8. watchdog(1)

    昨天对watchdog的代码浅显的看了一下,今天又有进一步的学习了,在看到我昨天处理了关于手机重启的问题我以为是WATCHDOG导致的,但是在LOG 中并没有发现WATCHDOG TIMEOUT,所以 ...

  9. Android:ANR问题是什么和如何避免

    文章目录 前言 一.ANR是什么? 二.ANR时间规定 1.Service Timeout 2.BroadcastQueue Timeout 3.ContentProvider Timeout 4.I ...

最新文章

  1. 凤凰城将很快迎来无人驾驶汽车
  2. js判断fck编辑器内容是否为空并获得焦点
  3. 1分钟爬取全国高校信息,制成大屏可视化!
  4. 2005年3月9日笔记
  5. ubuntu server 16.04 开启root密码登录
  6. 新技能 get —— 五笔打字
  7. 【语音去噪】基于matlab谱减法+最小均方+维纳滤波语音去噪【含Matlab源码 1542期】
  8. PRML 1.5 决策论
  9. 机器学习深度学习视频资料大汇总
  10. Windows打开应用,提示“此程序被组策略阻止”
  11. 随机打乱数据的几种方式
  12. LaTeX - 如何在图片说明(caption)中使用脚注(footnote)
  13. BM46 最小的K个数
  14. python交互方式是什么意思_python交互模式是什么
  15. oracle 抽样_oracle优化手段--统计信息导出和抽样提取数据
  16. EAUML日拱一卒-微信小程序实战:位置闹铃 (10)-定时器
  17. 数据中台 业务应用典型场景
  18. 如何合并报表简单快速?
  19. 控制系统设计指南第四版
  20. Linux黑科技与用户及组管理

热门文章

  1. 湖南文理计算机应用,三尺讲台迎冬夏 两寸笔头耕未来 ----记湖南文理学院计算机科学与技术学院娄小平博士...
  2. Java二十八:Java可变参数
  3. python二维列表添加_Python - 二维数组
  4. mysql - percona-xtrabackup 物理备份
  5. 项目中技术细节(button用法、前端操作json、 hibernate的query.setFirstResult的用法注意、struts2中日期格式化标签)
  6. 海外游戏视频广告怎么做
  7. java生日提醒_生日提醒功能-SQL查询语句在Java中肿么运用?
  8. SylixOS 绑核操作
  9. python调用xlwings常用代码
  10. hadoop的操作命令(第3课)