獲取 Android app 內(nèi)部各個(gè)thread的信息

在App調(diào)試或面試??的過程中欲诺,一個(gè)常見的問題是:如何獲取當(dāng)前的thread的狀態(tài)信息瓢喉。這一方法對(duì)于app 性能分析,或是解決運(yùn)行中的死鎖問題惊畏,往往顯得很有用處恶耽。

常見的場(chǎng)景是,線程A獲取了Lock A颜启, 線程B獲取了Lock B偷俭;隨后線程A進(jìn)一步想獲取Lock B,線程B進(jìn)一步想獲取Lock A缰盏,這樣就出現(xiàn)了死鎖涌萤。

thread A {
  lockA.lock();
  //...
  lockB.lock();
}
thread B {
  lockB.lock();
  //...
  lockA.lock();
}

這如果發(fā)生在主線程中,則會(huì)導(dǎo)致界面凍住口猜,跳出ANR的彈框负溪。


ANR

為了便于調(diào)試和分析,讓我們?cè)趃enymotion模擬器上調(diào)試運(yùn)行目標(biāo)app济炎,重現(xiàn)上述場(chǎng)景川抡。
隨后在命令行中執(zhí)行:

  1. adb shell ps -ef | grep <pkg-name>
    查找到當(dāng)前app的進(jìn)程id e.g. pid1

  2. adb shell run-as <pkg-name> kill -3 <pid1>

action code comments note
SIGQUIT 3 /* Quit (POSIX). */ 建立CORE文件終止進(jìn)程,并且生成core文件

向當(dāng)前app發(fā)送 QUIT signal须尚,此時(shí) console 中會(huì)顯示 Wrote stack traces to tombstoned崖堤,已將應(yīng)用的stack信息記錄下來了。

  1. adb bugreport ./bugreport.zip
    將出錯(cuò)信息導(dǎo)出到當(dāng)前目錄下的 bugreport.zip 文件中恨闪,解壓以后就能看到詳細(xì)的狀態(tài)信息了
    (更一般的倘感,如果出現(xiàn)app已經(jīng)出現(xiàn)了ANR,也可以直接從/data/anr/ 目錄下使用 adb pull 把a(bǔ)nr log 導(dǎo)出來)咙咽。

e.g.

"main" prio=5 tid=1 Waiting
  | group="main" sCount=1 dsCount=0 flags=1 obj=0x729291f0 self=0xe9c3ae00
  | sysTid=2742 nice=-10 cgrp=default sched=0/0 handle=0xea48bdc8
  | state=S schedstat=( 1000841099 167892657 575 ) utm=76 stm=23 core=1 HZ=100
  | stack=0xff23e000-0xff240000 stackSize=8192KB
  | held mutexes=
  at sun.misc.Unsafe.park(Native method)
  - waiting on an unknown object
  at java.util.concurrent.locks.LockSupport.park(LockSupport.java:190)
  at java.util.concurrent.locks.AbstractQueuedSynchronizer.parkAndCheckInterrupt(AbstractQueuedSynchronizer.java:868)
  at java.util.concurrent.locks.AbstractQueuedSynchronizer.acquireQueued(AbstractQueuedSynchronizer.java:902)
  at java.util.concurrent.locks.AbstractQueuedSynchronizer.acquire(AbstractQueuedSynchronizer.java:1227)
  at java.util.concurrent.locks.ReentrantReadWriteLock$WriteLock.lock(ReentrantReadWriteLock.java:950)
  at com.example.locktest.MainActivity.test(MainActivity.kt:65)
  at com.example.locktest.MainActivity.onCreate$lambda$2$lambda$1(MainActivity.kt:52)
  at com.example.locktest.MainActivity.$r8$lambda$97V3BXrElnLtyrlpwFsDN9nFJMY(MainActivity.kt:-1)
  at com.example.locktest.MainActivity$$ExternalSyntheticLambda1.onClick(D8$$SyntheticClass:-1)
  at com.google.android.material.snackbar.Snackbar$1.onClick(Snackbar.java:351)
  at android.view.View.performClick(View.java:7259)
  at com.google.android.material.button.MaterialButton.performClick(MaterialButton.java:1131)
  at android.view.View.performClickInternal(View.java:7236)
  at android.view.View.access$3600(View.java:801)
  at android.view.View$PerformClick.run(View.java:27892)
  at android.os.Handler.handleCallback(Handler.java:883)
  at android.os.Handler.dispatchMessage(Handler.java:100)
  at android.os.Looper.loop(Looper.java:214)
  at android.app.ActivityThread.main(ActivityThread.java:7356)
  at java.lang.reflect.Method.invoke(Native method)
  at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:492)
  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:930)

Ref :

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子婴栽,更是在濱河造成了極大的恐慌况脆,老刑警劉巖陪汽,帶你破解...
    沈念sama閱讀 218,284評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件馁蒂,死亡現(xiàn)場(chǎng)離奇詭異缩抡,居然都是意外死亡贺喝,警方通過查閱死者的電腦和手機(jī)寓涨,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,115評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門愚战,熙熙樓的掌柜王于貴愁眉苦臉地迎上來娇唯,“玉大人,你說我怎么就攤上這事寂玲∷澹” “怎么了?”我有些...
    開封第一講書人閱讀 164,614評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵拓哟,是天一觀的道長(zhǎng)想许。 經(jīng)常有香客問我,道長(zhǎng)断序,這世上最難降的妖魔是什么流纹? 我笑而不...
    開封第一講書人閱讀 58,671評(píng)論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮违诗,結(jié)果婚禮上漱凝,老公的妹妹穿的比我還像新娘。我一直安慰自己诸迟,他們只是感情好茸炒,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,699評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著亮蒋,像睡著了一般扣典。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上慎玖,一...
    開封第一講書人閱讀 51,562評(píng)論 1 305
  • 那天贮尖,我揣著相機(jī)與錄音,去河邊找鬼趁怔。 笑死湿硝,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的润努。 我是一名探鬼主播关斜,決...
    沈念sama閱讀 40,309評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼铺浇!你這毒婦竟也來了痢畜?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,223評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎丁稀,沒想到半個(gè)月后吼拥,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,668評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡线衫,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,859評(píng)論 3 336
  • 正文 我和宋清朗相戀三年凿可,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片授账。...
    茶點(diǎn)故事閱讀 39,981評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡枯跑,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出白热,到底是詐尸還是另有隱情敛助,我是刑警寧澤,帶...
    沈念sama閱讀 35,705評(píng)論 5 347
  • 正文 年R本政府宣布棘捣,位于F島的核電站辜腺,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏乍恐。R本人自食惡果不足惜评疗,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,310評(píng)論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望茵烈。 院中可真熱鬧百匆,春花似錦、人聲如沸呜投。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,904評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽仑荐。三九已至雕拼,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間粘招,已是汗流浹背啥寇。 一陣腳步聲響...
    開封第一講書人閱讀 33,023評(píng)論 1 270
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留洒扎,地道東北人辑甜。 一個(gè)月前我還...
    沈念sama閱讀 48,146評(píng)論 3 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像袍冷,于是被迫代替她去往敵國(guó)和親磷醋。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,933評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容