国产精品1024永久观看,大尺度欧美暖暖视频在线观看,亚洲宅男精品一区在线观看,欧美日韩一区二区三区视频,2021中文字幕在线观看

  • <option id="fbvk0"></option>
    1. <rt id="fbvk0"><tr id="fbvk0"></tr></rt>
      <center id="fbvk0"><optgroup id="fbvk0"></optgroup></center>
      <center id="fbvk0"></center>

      <li id="fbvk0"><abbr id="fbvk0"><dl id="fbvk0"></dl></abbr></li>

      提取程序無(wú)響應(yīng)發(fā)生時(shí)函數(shù)棧的提取方法和裝置與流程

      文檔序號(hào):11063404閱讀:338來(lái)源:國(guó)知局
      提取程序無(wú)響應(yīng)發(fā)生時(shí)函數(shù)棧的提取方法和裝置與制造工藝

      本申請(qǐng)涉及移動(dòng)終端技術(shù)領(lǐng)域,特別涉及一種提取程序無(wú)響應(yīng)發(fā)生時(shí)函數(shù)棧的提取方法和裝置。



      背景技術(shù):

      通常,在Android(安卓)系統(tǒng)中,如果應(yīng)用程序有一段時(shí)間響應(yīng)不靈敏,系統(tǒng)會(huì)向用戶顯示一個(gè)對(duì)話框,這個(gè)對(duì)話框被稱作應(yīng)用程序無(wú)響應(yīng)(Application Not Responding,簡(jiǎn)稱ANR)對(duì)話框,用戶可以選擇該對(duì)話框上的“等待”按鈕而讓程序繼續(xù)運(yùn)行,也可以選擇該對(duì)話框上的“強(qiáng)制關(guān)閉”按鈕來(lái)中斷程序的運(yùn)行。因此,在每次出現(xiàn)ANR的情況時(shí),用戶都要對(duì)應(yīng)用程序無(wú)響應(yīng)對(duì)話框進(jìn)行處理,從而造成用戶的體驗(yàn)感變差。

      為了提升用戶體驗(yàn),設(shè)計(jì)流暢合理的應(yīng)用程序成為必要。開發(fā)人員在開發(fā)應(yīng)用程序時(shí),需要通過(guò)抓取應(yīng)用程序無(wú)響應(yīng)來(lái)完善該應(yīng)用程序。相關(guān)技術(shù)中,抓取應(yīng)用程序無(wú)響應(yīng)(即ANR)的方法主要是:可先抓取出移動(dòng)終端(如手機(jī)等)上/data/anr目錄下的traces.txt文件(即應(yīng)用程序錯(cuò)誤信息反饋文件),之后,通過(guò)人工分析該文件里面的函數(shù)棧信息,找出屬于某個(gè)應(yīng)用程序的ANR。

      但是存在的問(wèn)題是,上述抓取ANR的方法,流程比較復(fù)雜,并且整個(gè)抓取過(guò)程主要都是通過(guò)人工來(lái)操作,增加了開發(fā)人員的工作量,增加了人工成本,且效率低。



      技術(shù)實(shí)現(xiàn)要素:

      本申請(qǐng)的目的旨在至少在一定程度上解決上述的技術(shù)問(wèn)題之一。

      為此,本申請(qǐng)的第一個(gè)目的在于提出了一種提取程序無(wú)響應(yīng)發(fā)生時(shí)函數(shù)棧的提取方法。該方法通過(guò)跨線程之間的交互來(lái)實(shí)現(xiàn)程序無(wú)響應(yīng)發(fā)生時(shí)主線程中函數(shù)棧的提取,整個(gè)提取過(guò)程完全自動(dòng)化,無(wú)需人工參與,降低了開發(fā)人員的工作量,降低了人工成本,提高了效率。

      本申請(qǐng)的第二個(gè)目的在于提出了一種提取程序無(wú)響應(yīng)發(fā)生時(shí)函數(shù)棧的提取裝置。

      為達(dá)上述目的,根據(jù)本申請(qǐng)第一方面的實(shí)施例提出了一種提取程序無(wú)響應(yīng)發(fā)生時(shí)函數(shù)棧的提取方法,包括以下步驟:建立子線程,并通過(guò)所述子線程建立第一變量和第二變量,其中,所述第二變量等于所述第一變量;所述子線程發(fā)送任務(wù)至主線程,其中,所述任務(wù) 用于在被所述主線程執(zhí)行時(shí)修改所述第一變量;所述子線程在預(yù)設(shè)時(shí)間之后判斷所述第一變量和第二變量是否相等;以及如果所述第一變量和第二變量相等,則所述子線程判斷所述任務(wù)未被所述主線程執(zhí)行而導(dǎo)致程序無(wú)響應(yīng),并提取所述主線程當(dāng)前的函數(shù)棧。

      本申請(qǐng)實(shí)施例的提取程序無(wú)響應(yīng)發(fā)生時(shí)函數(shù)棧的提取方法,可建立子線程,并通過(guò)子線程發(fā)送任務(wù)至主線程,并在預(yù)設(shè)時(shí)間后子線程判斷任務(wù)有無(wú)被主線程執(zhí)行,如果判斷出上述任務(wù)沒(méi)有被主線程執(zhí)行則提取上述主線程當(dāng)前的函數(shù)棧,即通過(guò)跨線程之間的交互來(lái)實(shí)現(xiàn)程序無(wú)響應(yīng)發(fā)生時(shí)主線程中函數(shù)棧的提取,整個(gè)提取過(guò)程完全自動(dòng)化,無(wú)需人工參與,降低了開發(fā)人員的工作量,降低了人工成本,提高了效率,并且通過(guò)將提取到的函數(shù)棧提交到移動(dòng)后臺(tái),方便了開發(fā)人員發(fā)現(xiàn)并解決問(wèn)題。

      為達(dá)上述目的,根據(jù)本申請(qǐng)的第二方面的實(shí)施例提出了一種提取程序無(wú)響應(yīng)發(fā)生時(shí)函數(shù)棧的提取裝置,包括:建立模塊,用于建立子線程,并通過(guò)所述子線程建立第一變量和第二變量,其中,所述第二變量等于所述第一變量;子線程控制模塊,其中,所述子線程控制模塊包括:任務(wù)發(fā)送子模塊,用于發(fā)送任務(wù)至主線程,其中,所述任務(wù)用于在被所述主線程執(zhí)行時(shí)修改所述第一變量;判斷子模塊,用于在預(yù)設(shè)時(shí)間之后判斷所述第一變量和第二變量是否相等;以及提取子模塊,用于在所述第一變量和第二變量相等時(shí),判斷所述任務(wù)未被所述主線程執(zhí)行而導(dǎo)致程序無(wú)響應(yīng),并提取所述主線程當(dāng)前的函數(shù)棧。

      本申請(qǐng)實(shí)施例的提取程序無(wú)響應(yīng)發(fā)生時(shí)函數(shù)棧的提取裝置,可通過(guò)建立模塊建立子線程,并通過(guò)子線程控制模塊中的任務(wù)發(fā)送子模塊發(fā)送任務(wù)至主線程,并在預(yù)設(shè)時(shí)間后判斷子模塊判斷任務(wù)有無(wú)被主線程執(zhí)行,如果判斷出上述任務(wù)沒(méi)有被主線程執(zhí)行則通過(guò)提取子模塊提取上述主線程當(dāng)前的函數(shù)棧,即通過(guò)跨線程之間的交互來(lái)實(shí)現(xiàn)程序無(wú)響應(yīng)發(fā)生時(shí)主線程中函數(shù)棧的提取,整個(gè)提取過(guò)程完全自動(dòng)化,無(wú)需人工參與,降低了開發(fā)人員的工作量,降低了人工成本,提高了效率,并且通過(guò)將提取到的函數(shù)棧提交到移動(dòng)后臺(tái),方便了開發(fā)人員發(fā)現(xiàn)并解決問(wèn)題。

      本申請(qǐng)附加的方面和優(yōu)點(diǎn)將在下面的描述中部分給出,部分將從下面的描述中變得明顯,或通過(guò)本申請(qǐng)的實(shí)踐了解到。

      附圖說(shuō)明

      本申請(qǐng)的上述和/或附加的方面和優(yōu)點(diǎn)從結(jié)合下面附圖對(duì)實(shí)施例的描述中將變得明顯和容易理解,其中:

      圖1是根據(jù)本申請(qǐng)一個(gè)實(shí)施例的提取程序無(wú)響應(yīng)發(fā)生時(shí)函數(shù)棧的提取方法的流程圖;

      圖2是根據(jù)本申請(qǐng)一個(gè)具體實(shí)施例的提取程序無(wú)響應(yīng)發(fā)生時(shí)函數(shù)棧的提取方法的示例圖;

      圖3是根據(jù)本申請(qǐng)另一個(gè)具體實(shí)施例的提取程序無(wú)響應(yīng)發(fā)生時(shí)函數(shù)棧的提取方法的流程圖;

      圖4是根據(jù)本申請(qǐng)一個(gè)實(shí)施例的提取程序無(wú)響應(yīng)發(fā)生時(shí)函數(shù)棧的提取裝置的結(jié)構(gòu)框圖;以及

      圖5是根據(jù)本申請(qǐng)另一個(gè)實(shí)施例的提取程序無(wú)響應(yīng)發(fā)生時(shí)函數(shù)棧的提取裝置的結(jié)構(gòu)框圖。

      具體實(shí)施方式

      下面詳細(xì)描述本申請(qǐng)的實(shí)施例,所述實(shí)施例的示例在附圖中示出,其中自始至終相同或類似的標(biāo)號(hào)表示相同或類似的元件或具有相同或類似功能的元件。下面通過(guò)參考附圖描述的實(shí)施例是示例性的,旨在用于解釋本申請(qǐng),而不能理解為對(duì)本申請(qǐng)的限制。

      下面參考附圖描述本申請(qǐng)實(shí)施例的提取程序無(wú)響應(yīng)發(fā)生時(shí)函數(shù)棧的提取方法和裝置。

      圖1是根據(jù)本申請(qǐng)一個(gè)實(shí)施例的提取程序無(wú)響應(yīng)發(fā)生時(shí)函數(shù)棧的提取方法的流程圖。需要說(shuō)明的是,本申請(qǐng)實(shí)施例的提取程序無(wú)響應(yīng)發(fā)生時(shí)函數(shù)棧的提取方法適用于具有Android操作系統(tǒng)的移動(dòng)終端,該移動(dòng)終端可以是手機(jī)、平板電腦、個(gè)人數(shù)字助理等硬件設(shè)備。此外,上述程序可以是安裝在移動(dòng)終端上的應(yīng)用程序,為了方便描述,后續(xù)實(shí)施例中將以測(cè)試應(yīng)用程序進(jìn)行描述。

      如圖1所示,該提取程序無(wú)響應(yīng)發(fā)生時(shí)函數(shù)棧的提取方法,包括以下步驟:

      S110,建立子線程,并通過(guò)子線程建立第一變量和第二變量,其中,第二變量等于第一變量。

      具體地,在本申請(qǐng)的一個(gè)實(shí)施例中,假設(shè)本申請(qǐng)實(shí)施例的提取方法應(yīng)用于具有Android操作系統(tǒng)的移動(dòng)終端上,當(dāng)測(cè)試應(yīng)用程序第一次啟動(dòng)時(shí),移動(dòng)終端可針對(duì)該測(cè)試應(yīng)用程序建立一個(gè)對(duì)應(yīng)的子線程,并且通過(guò)該子線程建立第一變量index和第二變量lastIndex,并將第二變量lastIndex等于第一變量index。例如,可將第一變量index賦初始值,然后將第二變量lastIndex的值等于第一變量index的初始值。

      優(yōu)選地,為了保證第一變量index在多線程訪問(wèn)時(shí)不被其他線程影響,在本申請(qǐng)的一個(gè)實(shí)施例中,在通過(guò)子線程建立第一變量之后,還可將該第一變量的屬性設(shè)置為不穩(wěn)定變量屬性值Volatile,以便于接下來(lái)對(duì)第一變量的修改。需要說(shuō)明的是,通過(guò)將第一變量屬性值設(shè)置為Volatile,可以保證第一變量在多線程訪問(wèn)時(shí)不被其他線程所影響,Volatile是一個(gè)類型修飾符,它用來(lái)修飾被不同線程訪問(wèn)和修改的變量,在本申請(qǐng)的實(shí)施例中,將第一變量的屬性值設(shè)置為Volatile相當(dāng)于告訴系統(tǒng)這個(gè)變量可能會(huì)被意想不到的改變,這樣系統(tǒng)的編譯器就不會(huì)去假設(shè)這個(gè)變量的值,也就是說(shuō),系統(tǒng)的優(yōu)化器在用到這個(gè)變量時(shí) 必須每次都小心地重新讀取這個(gè)變量的值,可以理解通過(guò)將第一變量的屬性值設(shè)置為Volatile,可以保證第一變量的值能準(zhǔn)確反映應(yīng)用程序的線程有無(wú)被主線程執(zhí)行,也就是說(shuō)只要檢測(cè)到第一變量值變化,就代表對(duì)應(yīng)的子線程被主線程執(zhí)行,同時(shí),只要第一變量值沒(méi)有發(fā)生變化,就代表對(duì)應(yīng)的子線程沒(méi)有被主線程執(zhí)行。

      S120,子線程發(fā)送任務(wù)至主線程,其中,上述任務(wù)用于在被主線程執(zhí)行時(shí)修改第一變量。

      可以理解,該主線程可以是在測(cè)試應(yīng)用程序啟動(dòng)時(shí),Android操作系統(tǒng)會(huì)啟動(dòng)一個(gè)該測(cè)試應(yīng)用程序?qū)?yīng)的線程,該主線程主要負(fù)責(zé)處理該測(cè)試應(yīng)用程序中與UI(User Interface,用戶界面)相關(guān)的事件,例如,用戶的按鍵事件、用戶接觸屏幕的事件以及屏幕繪圖事件等,并將相關(guān)的事件分發(fā)到對(duì)應(yīng)的組件進(jìn)行處理。

      具體地,在建立測(cè)試應(yīng)用程序?qū)?yīng)的子線程之后,該子線程可通過(guò)post方法發(fā)送任務(wù)至該測(cè)試應(yīng)用程序?qū)?yīng)的主線程,該任務(wù)可用于在被主線程執(zhí)行時(shí)修改第一變量,該任務(wù)可理解為一串代碼的集合。

      其中,在本申請(qǐng)的實(shí)施例中,任務(wù)在被主線程執(zhí)行時(shí)使得第一變量加1之后取余。具體地,主線程在執(zhí)行該任務(wù)時(shí),該任務(wù)可根據(jù)自身代碼集合對(duì)第一變量的值進(jìn)行修改,即每當(dāng)被主線程執(zhí)行時(shí)會(huì)將第一變量的值加1之后取余,例如,可將第一變量的值加1之后與常量10進(jìn)行取余,并將該取余得到的余數(shù)賦給第一變量。可以理解,這里取余是為了保持第一變量的值始終處于一定范圍內(nèi)(即處于比較小的數(shù)),如0-9的范圍內(nèi),這樣使得任務(wù)在執(zhí)行時(shí)不會(huì)發(fā)生溢出,避免了因溢出導(dǎo)致第一變量被重置從而導(dǎo)致接下來(lái)判斷不準(zhǔn)確的情況發(fā)生。

      例如,子線程可通過(guò)post方法發(fā)送一個(gè)任務(wù)Runnable,在該任務(wù)Runnable中定義了一些代碼集合,可用于在被主線程執(zhí)行時(shí)對(duì)第一變量index加1之后與常量10進(jìn)行取余,并將余數(shù)賦給第一變量index,即index=(index+1)%10。其中,上述的post方法指的是一種向目的服務(wù)器發(fā)送更新請(qǐng)求,并附有請(qǐng)求實(shí)體的一種方法,比如用來(lái)上傳文件、將表格的結(jié)果提交給數(shù)據(jù)處理過(guò)程等,在本申請(qǐng)的實(shí)施例中,post方法可用來(lái)將子線程發(fā)送的任務(wù)發(fā)送到主線程。

      需要說(shuō)明的是,如果主線程執(zhí)行子線程發(fā)送的任務(wù),那么上述任務(wù)就會(huì)對(duì)第一變量進(jìn)行修改,可以理解第一變量如果被修改那么就代表主線程執(zhí)行了子線程發(fā)送的任務(wù)。

      還需要說(shuō)明的是,在本申請(qǐng)的一個(gè)實(shí)施例中,上述任務(wù)在被主線程執(zhí)行時(shí),還可用于控制子線程休眠預(yù)設(shè)時(shí)間。其中,在本申請(qǐng)的實(shí)施例中,由于在默認(rèn)情況下,Android操作系統(tǒng)中Activity的最長(zhǎng)執(zhí)行時(shí)間一般為5s,所以可將預(yù)設(shè)時(shí)間設(shè)定為5s。可以理解,還可根據(jù)實(shí)際測(cè)試應(yīng)用程序的情況而設(shè)定該預(yù)設(shè)時(shí)間的值。也就是說(shuō),任務(wù)在被主線程執(zhí)行 時(shí),在修改第一變量的同時(shí),還可控制子線程sleep5秒,以為該任務(wù)能夠被主線程執(zhí)行提供一定的時(shí)間。

      S130,子線程在預(yù)設(shè)時(shí)間之后判斷第一變量和第二變量是否相等。

      具體地,在控制子線程休眠預(yù)設(shè)時(shí)間之后,子線程可判斷此時(shí)的第一變量的值和第二變量的值是否相等。

      S140,如果第一變量和第二變量相等,則子線程判斷任務(wù)未被主線程執(zhí)行而導(dǎo)致程序無(wú)響應(yīng),并提取主線程當(dāng)前的函數(shù)棧。

      具體地,如果在子線程休眠預(yù)設(shè)時(shí)間后,子線程判斷此時(shí)的第一變量和第二變量相等,則可判斷子線程發(fā)送給主線程的任務(wù)未被主線程執(zhí)行而導(dǎo)致程序無(wú)響應(yīng),這樣可以判定主線程肯定是被某個(gè)函數(shù)阻塞住而沒(méi)有執(zhí)行上述任務(wù),這時(shí)可提取主線程當(dāng)前的函數(shù)棧。

      優(yōu)選地,在提取主線程當(dāng)前的函數(shù)棧之后,可將該函數(shù)棧上傳至服務(wù)器端并記錄下來(lái),以供開發(fā)人員發(fā)現(xiàn)并解決問(wèn)題。

      舉例而言,如圖2所示,當(dāng)測(cè)試應(yīng)用程序啟動(dòng)時(shí),移動(dòng)終端可建立一個(gè)該測(cè)試應(yīng)用程序?qū)?yīng)的子線程,并通過(guò)子線程建立第一變量index,其中將第一變量index設(shè)置為volatile屬性,并建立第二變量lastIndex,使得第二變量lastIndex等于第一變量index。之后,子線程可通過(guò)post方法發(fā)送一個(gè)任務(wù)Runnable到該測(cè)試應(yīng)用程序的主線程中,其中,在Runnable中,可以讓index+1取余,即index=(index+1)%10,同時(shí)控制子線程sleep5秒。在子線程sleep5秒之后,子線程可判斷第二變量lastIndex和第一變量index是否相等,如果相等,則說(shuō)明post到主線程的Runnable并沒(méi)有被主線程執(zhí)行,這樣可以判斷主線程可能是被某個(gè)函數(shù)阻塞住了而沒(méi)有被執(zhí)行,這時(shí)候可以捕獲出主線程當(dāng)前的函數(shù)棧并將其上傳到服務(wù)端后臺(tái)記錄下來(lái)。

      本申請(qǐng)實(shí)施例的提取程序無(wú)響應(yīng)發(fā)生時(shí)函數(shù)棧的提取方法,可建立子線程,并通過(guò)子線程發(fā)送任務(wù)至主線程,并在預(yù)設(shè)時(shí)間后子線程判斷任務(wù)有無(wú)被主線程執(zhí)行,如果判斷出上述任務(wù)沒(méi)有被主線程執(zhí)行則提取上述主線程當(dāng)前的函數(shù)棧,即通過(guò)跨線程之間的交互來(lái)實(shí)現(xiàn)程序無(wú)響應(yīng)發(fā)生時(shí)主線程中函數(shù)棧的提取,整個(gè)提取過(guò)程完全自動(dòng)化,無(wú)需人工參與,降低了開發(fā)人員的工作量,降低了人工成本,提高了效率,并且通過(guò)將提取到的函數(shù)棧提交到移動(dòng)后臺(tái),方便了開發(fā)人員發(fā)現(xiàn)并解決問(wèn)題。

      圖3是根據(jù)本申請(qǐng)一個(gè)具體實(shí)施例的提取程序無(wú)響應(yīng)發(fā)生時(shí)函數(shù)棧的提取方法的流程圖。

      如圖3所示,本申請(qǐng)實(shí)施例的提取程序無(wú)響應(yīng)發(fā)生時(shí)函數(shù)棧的提取方法,包括:

      S310,建立子線程,并通過(guò)子線程建立第一變量和第二變量,其中,第二變量等于第一變量。

      S320,子線程發(fā)送任務(wù)至主線程,其中,上述任務(wù)用于在被主線程執(zhí)行時(shí)修改第一變量。

      S330,子線程在預(yù)設(shè)時(shí)間之后判斷第一變量和第二變量是否相等。

      S340,如果第一變量和第二變量相等,則子線程判斷任務(wù)未被主線程執(zhí)行而導(dǎo)致程序無(wú)響應(yīng),并提取主線程當(dāng)前的函數(shù)棧。

      S350,如果第一變量和第二變量不相等,則子線程判斷任務(wù)已被主線程執(zhí)行。

      具體而言,在本申請(qǐng)的實(shí)施例中,如果子線程判斷出第一變量和第二變量不相等,子線程判斷任務(wù)已經(jīng)被主線程執(zhí)行。即在子線程發(fā)送給主線程任務(wù)后,主線程在執(zhí)行該任務(wù)時(shí),可通過(guò)該任務(wù)使得第一變量加1之后與常量10取余,并將余數(shù)賦給第一變量,從而使得第一變量發(fā)生了變化,子線程在休眠預(yù)設(shè)時(shí)間之后,判斷此時(shí)的第一變量和第二變量不相等,從而判斷出任務(wù)已經(jīng)被主線程執(zhí)行。

      本申請(qǐng)實(shí)施例的提取程序無(wú)響應(yīng)發(fā)生時(shí)函數(shù)棧的提取方法,子線程在預(yù)設(shè)時(shí)間后判斷第一變量和第二變量不相等時(shí),判斷任務(wù)已被主線程執(zhí)行,從而實(shí)現(xiàn)了對(duì)程序有無(wú)響應(yīng)的快速判斷,方便了開發(fā)人員對(duì)應(yīng)用程序運(yùn)行情況的了解。

      為了實(shí)現(xiàn)上述實(shí)施例,本申請(qǐng)還提出了一種提取程序無(wú)響應(yīng)發(fā)生時(shí)函數(shù)棧的提取裝置。

      圖4是根據(jù)本申請(qǐng)一個(gè)實(shí)施例的提取程序無(wú)響應(yīng)發(fā)生時(shí)函數(shù)棧的提取裝置的結(jié)構(gòu)框圖。需要說(shuō)明的是,本申請(qǐng)實(shí)施例的提取程序無(wú)響應(yīng)發(fā)生時(shí)函數(shù)棧的提取裝置適用于具有Android操作系統(tǒng)的移動(dòng)終端,該移動(dòng)終端可以是手機(jī)、平板電腦、個(gè)人數(shù)字助理等硬件設(shè)備。

      如圖4所示,該提取程序無(wú)響應(yīng)發(fā)生時(shí)函數(shù)棧的提取裝置,包括:建立模塊410和子線程控制模塊420。

      具體地,建立模塊410可用于建立子線程,并通過(guò)子線程建立第一變量和第二變量,其中,第二變量等于第一變量。

      更具體地,在本申請(qǐng)的一個(gè)實(shí)施例中,假設(shè)本申請(qǐng)實(shí)施例的提取裝置應(yīng)用于具有Android操作系統(tǒng)的移動(dòng)終端上,當(dāng)測(cè)試應(yīng)用程序啟動(dòng)時(shí),建立模塊410可針對(duì)該測(cè)試應(yīng)用程序建立一個(gè)對(duì)應(yīng)的子線程,并且通過(guò)該子線程建立第一變量index和第二變量lastIndex,并將第二變量lastIndex等于第一變量index。例如,可將第一變量index賦初始值,然后將第二變量lastIndex的值等于第一變量index的初始值。

      在本申請(qǐng)的實(shí)施例中,如圖4所示,子線程控制模塊420可包括:任務(wù)發(fā)送子模塊421、判斷子模塊422和提取子模塊423。

      具體地,任務(wù)發(fā)送子模塊421可用于發(fā)送任務(wù)至主線程,其中,上述任務(wù)用于在被主線程執(zhí)行時(shí)修改第一變量。

      可以理解,該主線程可以是在測(cè)試應(yīng)用程序啟動(dòng)時(shí),Android操作系統(tǒng)會(huì)啟動(dòng)一個(gè)該測(cè)試應(yīng)用程序?qū)?yīng)的線程,該主線程主要負(fù)責(zé)處理該測(cè)試應(yīng)用程序中與UI(User Interface,用戶界面)相關(guān)的事件,例如,用戶的按鍵事件、用戶接觸屏幕的事件以及屏幕繪圖事件等,并將相關(guān)的事件分發(fā)到對(duì)應(yīng)的組件進(jìn)行處理。

      更具體地,在建立模塊410建立測(cè)試應(yīng)用程序?qū)?yīng)的子線程之后,任務(wù)發(fā)送子模塊421可通過(guò)post方法發(fā)送任務(wù)至該測(cè)試應(yīng)用程序?qū)?yīng)的主線程,該任務(wù)可用于在被主線程執(zhí)行時(shí)修改第一變量,該任務(wù)可理解為一串代碼的集合。其中,在本申請(qǐng)的實(shí)施例中,任務(wù)在被主線程執(zhí)行時(shí)使得第一變量加1之后取余。具體地,主線程在執(zhí)行該任務(wù)時(shí),該任務(wù)可根據(jù)自身代碼集合對(duì)第一變量的值進(jìn)行修改,即每當(dāng)被主線程執(zhí)行時(shí)會(huì)將第一變量的值加1之后取余,例如,可將第一變量的值加1之后與常量10進(jìn)行取余,并將該取余得到的余數(shù)賦給第一變量。可以理解,這里取余是為了保持第一變量的值始終處于一定范圍內(nèi)(即處于比較小的數(shù)),如0-9的范圍內(nèi),這樣使得任務(wù)在執(zhí)行時(shí)不會(huì)發(fā)生溢出,避免了因溢出導(dǎo)致第一變量被重置從而導(dǎo)致接下來(lái)判斷不準(zhǔn)確的情況發(fā)生。

      例如,任務(wù)發(fā)送子模塊421可通過(guò)post方法發(fā)送一個(gè)任務(wù)Runnable,在該任務(wù)Runnable中定義了一些代碼集合,可用于在被主線程執(zhí)行時(shí)對(duì)第一變量index加1之后與常量10進(jìn)行取余,并將余數(shù)賦給第一變量index,即index=(index+1)%10。其中,上述的post方法指的是一種向目的服務(wù)器發(fā)送更新請(qǐng)求,并附有請(qǐng)求實(shí)體的一種方法,比如用來(lái)上傳文件、將表格的結(jié)果提交給數(shù)據(jù)處理過(guò)程等,在本申請(qǐng)的實(shí)施例中,post方法可用來(lái)將子線程發(fā)送的任務(wù)發(fā)送到主線程。需要說(shuō)明的是,如果主線程執(zhí)行任務(wù)發(fā)送子模塊421發(fā)送的任務(wù),那么上述任務(wù)就會(huì)對(duì)第一變量進(jìn)行修改,可以理解第一變量如果被修改那么就代表主線程執(zhí)行了任務(wù)發(fā)送子模塊421發(fā)送的任務(wù)。

      還需要說(shuō)明的是,在本申請(qǐng)的一個(gè)實(shí)施例中,上述任務(wù)在被主線程執(zhí)行時(shí),還可用于控制子線程休眠預(yù)設(shè)時(shí)間。其中,在本申請(qǐng)的實(shí)施例中,由于在默認(rèn)情況下,Android操作系統(tǒng)中Activity的最長(zhǎng)執(zhí)行時(shí)間一般為5s,所以可將預(yù)設(shè)時(shí)間設(shè)定為5s。可以理解,還可根據(jù)實(shí)際測(cè)試應(yīng)用程序的情況而設(shè)定該預(yù)設(shè)時(shí)間的值。也就是說(shuō),任務(wù)在被主線程執(zhí)行時(shí),在修改第一變量的同時(shí),還可控制子線程sleep5秒,以為該任務(wù)能夠被主線程執(zhí)行提供一定的時(shí)間。

      判斷子模塊422可用于在預(yù)設(shè)時(shí)間之后判斷第一變量和第二變量是否相等。

      更具體地,在任務(wù)控制子線程休眠預(yù)設(shè)時(shí)間之后,判斷子模塊422可判斷此時(shí)的第一變量和第二變量的值是否相等。

      可以理解,在本申請(qǐng)的實(shí)施例中,判斷子模塊422還可用于在第一變量和第二變量不相等時(shí),判斷任務(wù)已被主線程執(zhí)行。具體而言,判斷子模塊422在判斷出第一變量和第二 變量不相等時(shí),可判斷任務(wù)已經(jīng)被主線程執(zhí)行。即在任務(wù)發(fā)送子模塊421發(fā)送給主線程任務(wù)后,主線程在執(zhí)行該任務(wù)時(shí),可通過(guò)該任務(wù)使得第一變量加1之后與常量10取余,并將余數(shù)賦給第一變量,從而使得第一變量發(fā)生了變化,子線程在休眠預(yù)設(shè)時(shí)間之后,判斷子模塊422判斷此時(shí)的第一變量和第二變量不相等,從而判斷出任務(wù)已經(jīng)被主線程執(zhí)行。由此,實(shí)現(xiàn)了對(duì)程序有無(wú)響應(yīng)的快速判斷,方便了開發(fā)人員對(duì)應(yīng)用程序運(yùn)行情況的了解。

      提取子模塊423可用于在第一變量和第二變量相等時(shí),判斷任務(wù)未被主線程執(zhí)行而導(dǎo)致程序無(wú)響應(yīng),并提取主線程當(dāng)前的函數(shù)棧。

      更具體地,如果在子線程休眠預(yù)設(shè)時(shí)間后,判斷子模塊422判斷此時(shí)的第一變量和第二變量相等,則可判斷子線程發(fā)送給主線程的任務(wù)未被主線程執(zhí)行而導(dǎo)致程序無(wú)響應(yīng),這樣可以判定主線程肯定是被某個(gè)函數(shù)阻塞住而沒(méi)有執(zhí)行上述任務(wù),這時(shí)提取子模塊423可提取主線程當(dāng)前的函數(shù)棧。

      優(yōu)選地,提取子模塊423在提取主線程當(dāng)前的函數(shù)棧之后,可將該函數(shù)棧上傳至服務(wù)器端并記錄下來(lái),以供開發(fā)人員發(fā)現(xiàn)并解決問(wèn)題。

      為了保證第一變量index在多線程訪問(wèn)時(shí)不被其他線程影響,優(yōu)選地,在本申請(qǐng)的一個(gè)實(shí)施例中,如圖5所示,在建立模塊410通過(guò)子線程建立第一變量之后,該提取裝置還包括設(shè)置模塊430,設(shè)置模塊430可將該第一變量的屬性設(shè)置為不穩(wěn)定變量屬性值Volatile,以便于上述任務(wù)發(fā)送子模塊421發(fā)送的任務(wù)被主線程執(zhí)行時(shí)對(duì)第一變量的修改。需要說(shuō)明的是,通過(guò)設(shè)置模塊430將第一變量屬性值設(shè)置為Volatile,可以保證第一變量在多線程訪問(wèn)時(shí)不被其他線程所影響,Volatile是一個(gè)類型修飾符,它用來(lái)修飾被不同線程訪問(wèn)和修改的變量,在本申請(qǐng)的實(shí)施例中,將第一變量的屬性值設(shè)置為Volatile相當(dāng)于告訴系統(tǒng)這個(gè)變量可能會(huì)被意想不到的改變,這樣系統(tǒng)的編譯器就不會(huì)去假設(shè)這個(gè)變量的值,也就是說(shuō),系統(tǒng)的優(yōu)化器在用到這個(gè)變量時(shí)必須每次都小心地重新讀取這個(gè)變量的值,可以理解通過(guò)將第一變量的屬性值設(shè)置為Volatile,可以保證第一變量的值能準(zhǔn)確反映應(yīng)用程序的線程有無(wú)被主線程執(zhí)行,也就是說(shuō)只要檢測(cè)到第一變量值變化,就代表對(duì)應(yīng)的子線程被主線程執(zhí)行,同時(shí),只要第一變量值沒(méi)有發(fā)生變化,就代表對(duì)應(yīng)的子線程沒(méi)有被主線程執(zhí)行。本申請(qǐng)實(shí)施例的提取程序無(wú)響應(yīng)發(fā)生時(shí)函數(shù)棧的提取裝置,可通過(guò)建立模塊建立子線程,并通過(guò)子線程控制模塊中的任務(wù)發(fā)送子模塊發(fā)送任務(wù)至主線程,并在預(yù)設(shè)時(shí)間后判斷子模塊判斷任務(wù)有無(wú)被主線程執(zhí)行,如果判斷出上述任務(wù)沒(méi)有被主線程執(zhí)行則通過(guò)提取子模塊提取上述主線程當(dāng)前的函數(shù)棧,即通過(guò)跨線程之間的交互來(lái)實(shí)現(xiàn)程序無(wú)響應(yīng)發(fā)生時(shí)主線程中函數(shù)棧的提取,整個(gè)提取過(guò)程完全自動(dòng)化,無(wú)需人工參與,降低了開發(fā)人員的工作量,降低了人工成本,提高了效率,并且通過(guò)將提取到的函數(shù)棧提交到移動(dòng)后臺(tái),方便了開發(fā)人員發(fā)現(xiàn)并解決問(wèn)題。

      在本申請(qǐng)的描述中,需要理解的是,術(shù)語(yǔ)“第一”、“第二”僅用于描述目的,而不能理解為指示或暗示相對(duì)重要性或者隱含指明所指示的技術(shù)特征的數(shù)量。由此,限定有“第一”、“第二”的特征可以明示或者隱含地包括至少一個(gè)該特征。在本申請(qǐng)的描述中,“多個(gè)”的含義是至少兩個(gè),例如兩個(gè),三個(gè)等,除非另有明確具體的限定。

      在本說(shuō)明書的描述中,參考術(shù)語(yǔ)“一個(gè)實(shí)施例”、“一些實(shí)施例”、“示例”、“具體示例”、或“一些示例”等的描述意指結(jié)合該實(shí)施例或示例描述的具體特征、結(jié)構(gòu)、材料或者特點(diǎn)包含于本申請(qǐng)的至少一個(gè)實(shí)施例或示例中。在本說(shuō)明書中,對(duì)上述術(shù)語(yǔ)的示意性表述不必須針對(duì)的是相同的實(shí)施例或示例。而且,描述的具體特征、結(jié)構(gòu)、材料或者特點(diǎn)可以在任一個(gè)或多個(gè)實(shí)施例或示例中以合適的方式結(jié)合。此外,在不相互矛盾的情況下,本領(lǐng)域的技術(shù)人員可以將本說(shuō)明書中描述的不同實(shí)施例或示例以及不同實(shí)施例或示例的特征進(jìn)行結(jié)合和組合。

      流程圖中或在此以其他方式描述的任何過(guò)程或方法描述可以被理解為,表示包括一個(gè)或更多個(gè)用于實(shí)現(xiàn)特定邏輯功能或過(guò)程的步驟的可執(zhí)行指令的代碼的模塊、片段或部分,并且本申請(qǐng)的優(yōu)選實(shí)施方式的范圍包括另外的實(shí)現(xiàn),其中可以不按所示出或討論的順序,包括根據(jù)所涉及的功能按基本同時(shí)的方式或按相反的順序,來(lái)執(zhí)行功能,這應(yīng)被本申請(qǐng)的實(shí)施例所屬技術(shù)領(lǐng)域的技術(shù)人員所理解。

      應(yīng)當(dāng)理解,本申請(qǐng)的各部分可以用硬件、軟件、固件或它們的組合來(lái)實(shí)現(xiàn)。在上述實(shí)施方式中,多個(gè)步驟或方法可以用存儲(chǔ)在存儲(chǔ)器中且由合適的指令執(zhí)行系統(tǒng)執(zhí)行的軟件或固件來(lái)實(shí)現(xiàn)。例如,如果用硬件來(lái)實(shí)現(xiàn),和在另一實(shí)施方式中一樣,可用本領(lǐng)域公知的下列技術(shù)中的任一項(xiàng)或他們的組合來(lái)實(shí)現(xiàn):具有用于對(duì)數(shù)據(jù)信號(hào)實(shí)現(xiàn)邏輯功能的邏輯門電路的離散邏輯電路,具有合適的組合邏輯門電路的專用集成電路,可編程門陣列(PGA),現(xiàn)場(chǎng)可編程門陣列(FPGA)等。

      本技術(shù)領(lǐng)域的普通技術(shù)人員可以理解實(shí)現(xiàn)上述實(shí)施例方法攜帶的全部或部分步驟是可以通過(guò)程序來(lái)指令相關(guān)的硬件完成,所述的程序可以存儲(chǔ)于一種計(jì)算機(jī)可讀存儲(chǔ)介質(zhì)中,該程序在執(zhí)行時(shí),包括方法實(shí)施例的步驟之一或其組合。

      此外,在本申請(qǐng)各個(gè)實(shí)施例中的各功能單元可以集成在一個(gè)處理模塊中,也可以是各個(gè)單元單獨(dú)物理存在,也可以兩個(gè)或兩個(gè)以上單元集成在一個(gè)模塊中。上述集成的模塊既可以采用硬件的形式實(shí)現(xiàn),也可以采用軟件功能模塊的形式實(shí)現(xiàn)。所述集成的模塊如果以軟件功能模塊的形式實(shí)現(xiàn)并作為獨(dú)立的產(chǎn)品銷售或使用時(shí),也可以存儲(chǔ)在一個(gè)計(jì)算機(jī)可讀取存儲(chǔ)介質(zhì)中。

      上述提到的存儲(chǔ)介質(zhì)可以是只讀存儲(chǔ)器,磁盤或光盤等。盡管上面已經(jīng)示出和描述了 本申請(qǐng)的實(shí)施例,可以理解的是,上述實(shí)施例是示例性的,不能理解為對(duì)本申請(qǐng)的限制,本領(lǐng)域的普通技術(shù)人員在本申請(qǐng)的范圍內(nèi)可以對(duì)上述實(shí)施例進(jìn)行變化、修改、替換和變型。

      當(dāng)前第1頁(yè)1 2 3 
      網(wǎng)友詢問(wèn)留言 已有0條留言
      • 還沒(méi)有人留言評(píng)論。精彩留言會(huì)獲得點(diǎn)贊!
      1