SBA of anr/watchdog timeout

本文深入分析了Android系统中ANR(应用程序无响应)和Watchdog超时的问题,主要从bugreport和日志中提取关键信息。区别在于ANR发生在应用进程的主线程,而Watchdog超时则发生在system_server进程的特定线程。通过检查线程状态、函数调用、Binder IPC和锁的持有,找出导致系统不稳定的原因。通过对 Multimedia 组件如MediaPlayer的调用链分析,揭示了可能的阻塞点和锁竞争,为解决系统稳定性问题提供了方向。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

                                                           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中时间点附近有无异常

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值