SBA of anr/watchdog timeout
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相关推荐
- Win10蓝屏win32k power watchdog timeout 蓝屏代码0x0000019C
环境: Win 10专业版 联想E14 问题描述: Win10蓝屏0x0000019C win32k power watchdog timeout 解决方案: WIN32K_POWER_WATCHDO ...
- Watchdog机制原理
Watchdog机制 1.什么是SWT: Softwere Watchdog Timeout,顾名思义就是软件超时监控狗. Watchdog.java 位于frameworks/base/servic ...
- Android 性能优化系列:ANR 触发原理与分析
文章目录 什么是 ANR? ANR 发生场景 系统对 ANR 的捕捉原理 如何分析 ANR traces.txt 信息概览 日志分析思路 ANR 日志准备(traces.txt + mainlog) ...
- PostgreSQL 来自欧罗巴Patroni watchdog 汪汪汪 5
已经写到了第五期, 最近深感学习一件东西,可以和秋风扫落叶的一样的学习和理解,也可以和冰血暴一样的学习了理解,决定用那种方式学习,主要依靠 1 这门技术是临时使用还是基础性的常识 2 这么技术是处 ...
- Android 输入系统 ANR机制的设计与实现
/ 今日科技快讯 / 据报道,字节跳动将于今年下半年在国内推出一款音乐流媒体产品,目前该产品已进入关键开发阶段,产品名称暂定"飞乐",项目内部代号为"luna&q ...
- 反思|Android 输入系统 ANR机制的设计与实现
反思 系列博客是我的一种新学习方式的尝试,该系列起源和目录请参考 这里 . 概述 对于Android开发者而言,ANR是一个老生常谈的问题,站在面试者的角度,似乎说出 「不要在主线程做耗时操作」 就算 ...
- 瑞昱rtl819x-SDK-v3.4.14b的watchdog分析
watchdog 看门狗,又叫watchdog timer,是一个定时器电路,一般有一个输入,叫喂狗或踢狗:一个输出到MCU 的 RST 端,MCU 正常工作的时候,每隔一段时间输出一个信号到喂狗端, ...
- watchdog(1)
昨天对watchdog的代码浅显的看了一下,今天又有进一步的学习了,在看到我昨天处理了关于手机重启的问题我以为是WATCHDOG导致的,但是在LOG 中并没有发现WATCHDOG TIMEOUT,所以 ...
- Android:ANR问题是什么和如何避免
文章目录 前言 一.ANR是什么? 二.ANR时间规定 1.Service Timeout 2.BroadcastQueue Timeout 3.ContentProvider Timeout 4.I ...
最新文章
- 凤凰城将很快迎来无人驾驶汽车
- js判断fck编辑器内容是否为空并获得焦点
- 1分钟爬取全国高校信息,制成大屏可视化!
- 2005年3月9日笔记
- ubuntu server 16.04 开启root密码登录
- 新技能 get —— 五笔打字
- 【语音去噪】基于matlab谱减法+最小均方+维纳滤波语音去噪【含Matlab源码 1542期】
- PRML 1.5 决策论
- 机器学习深度学习视频资料大汇总
- Windows打开应用,提示“此程序被组策略阻止”
- 随机打乱数据的几种方式
- LaTeX - 如何在图片说明(caption)中使用脚注(footnote)
- BM46 最小的K个数
- python交互方式是什么意思_python交互模式是什么
- oracle 抽样_oracle优化手段--统计信息导出和抽样提取数据
- EAUML日拱一卒-微信小程序实战:位置闹铃 (10)-定时器
- 数据中台 业务应用典型场景
- 如何合并报表简单快速?
- 控制系统设计指南第四版
- Linux黑科技与用户及组管理
热门文章
- 湖南文理计算机应用,三尺讲台迎冬夏 两寸笔头耕未来
----记湖南文理学院计算机科学与技术学院娄小平博士...
- Java二十八:Java可变参数
- python二维列表添加_Python - 二维数组
- mysql - percona-xtrabackup 物理备份
- 项目中技术细节(button用法、前端操作json、 hibernate的query.setFirstResult的用法注意、struts2中日期格式化标签)
- 海外游戏视频广告怎么做
- java生日提醒_生日提醒功能-SQL查询语句在Java中肿么运用?
- SylixOS 绑核操作
- python调用xlwings常用代码
- hadoop的操作命令(第3课)