本篇針對應用記憶體洩漏測試,簡單介紹一下記憶體洩漏的危害,記憶體洩漏指程式中己動態分配的堆記憶體由於某種原因程式未釋放或無法釋放,造成系統記憶體的浪費,導致程式執行速度減慢甚至系統崩潰等嚴重後果。簡單來說就是如果存在記憶體洩漏的話,應用會越用越卡,最後導致應用崩潰。
前提準備條件:
1、手機root許可權,模擬器也可
2、對應系統的procrank,procmem,libpagemap.so檔案
3、獲取記憶體資料的指令碼
4、adb環境
操作步驟:
1、命令列重新掛載一下分割槽
adb root
adb remount
adb logcat -c
2、將procmem、procrank推到/system/xbin下,將libpagemap.so推到/system/lib下
同時修改三個檔案許可權
adb push procmem /system/xbin
adb push procrank /system/xbin
adb push libpagemap.so /system/lib
adb shell
cd /system/xbin
chmod 777 procrank
chmod 777 procmem
cd …/lib
chmod 777 libpagemap.so
3、開始輸入參考的monkey指令,開始進行隨機指令
參考指令
adb shell monkey -p *** --ignore-timeouts --ignore-crashes --ignore-security-exceptions --monitor-native-crashes --throttle 500 -v -v 36000 > monkey.txt
4、啟動指令碼,獲取procrank資料,等待monkey結束
參考指令碼
import os,subprocess,re
def _getdevice():
# 獲取所有裝置devices,獲得乙個tuple
devicersp = subprocess.popen("adb devices",stdout=subprocess.pipe,stderr=subprocess.pipe,shell=true).communicate()[0]
# 正則提取一下裝置device,return乙個list
device = re.findall('(.*)\tdevice',devicersp.decode('utf8'))
print(device)
return device
def _getfilename(to_file,device):
# 開啟檔案,根據裝置名稱決定,預設用夜神模擬器,埠62001
__device_list =
for each in device:
str(each).replace(':','_').replace('.','') # 模擬器的坑
if ":" in each:
each = "62001"
# 根據傳入的路徑判斷
if to_file is none:
# 刪除已有檔案
if os.path.exists(__device_list):
os.remove(__device_list)
else:
# 傳入路徑沒有加字尾,給補上
if os.path.splitext(to_file)[1] == '':
else:
break
return __device_list
def procrank(to_file=none,package=none,device='',e_num=1000):
''':param to_file:寫入檔案路徑
:param pakage: 包名
:param e_num: 結束迴圈的次數
:return:
'''# 檢查裝置id,如果沒有id則獲取
try:
if device =='':
device = _getdevice()
elif not isinstance(device,str):
raise typeerror('裝置device不正確,請給字串型別')
except:
raise exception('獲取裝置錯誤_getdevice,或輸入裝置id錯誤')
# 開啟檔案
d = _getfilename(to_file,device)
try:
f = open(d[0],'a+',encoding='utf8')
except exception as e:
raise exception('錯誤:%s\t檔案開啟失敗,請確認檔案路徑,以及檔案型別,建議txt檔案'%e)
if package is none:
cmd = 'adb shell procrank'
elif os.name == 'posix':
cmd = 'adb shell procrank |grep '.format(package)
elif os.name == 'nt':
cmd = 'adb shell procrank |findstr '.format(package)
# 迴圈獲取procrank
for n in range(e_num):
# windows解碼byte型別變成了空,mac解碼變成了str,統一用byte
d = subprocess.popen(cmd,stdout=subprocess.pipe,stderr=subprocess.pipe,shell=true).stdout.read()
print(str(d))
f.write(str(d))
f.close()
if __name__ == '__main__':
to_file = '1.txt'
procrank(to_file,package='com.android.gallery3d',device='127.0.0.1:62001',e_num=240000)
5、第二天之後將指令碼得到資料複製貼上到txt檔案中,也可以直接觀察生成的txt檔案。觀察執行的應用有無報錯
檔案內容大致為
b' 2114 1340816k 56312k 12352k 9912k com.android.gallery3d\r\n'
b' 2114 1340816k 56312k 12352k 9912k com.android.gallery3d\r\n'
b' 2114 1340816k 56312k 12352k 9912k com.android.gallery3d\r\n'
b' 2114 1340816k 56312k 12352k 9912k com.android.gallery3d\r\n'
b' 2114 1340816k 56312k 12352k 9912k com.android.gallery3d\r\n'
b' 2114 1340816k 56312k 12352k 9912k com.android.gallery3d\r\n'
b' 2114 1340816k 56312k 12352k 9912k com.android.gallery3d\r\n'
b' 2114 1340816k 56312k 12352k 9912k com.android.gallery3d\r\n'
6、將txt檔案中的資料貼上到excel中,將uss一列所有的資料篩選出來,使用折線圖製作
uss為第四列中資料,需要整理這一列資料,去掉k,excel整理這裡就不發了。
7、如果發現折線圖走勢偏上,則再次ddms儲存一下hprof檔案,發給研發人員或者自己解析一下記憶體釋放問題
補充:獲取包名,前台僅開啟要測試的應用,命令列輸入:
adb shell dumpsys window w |findstr / |findstr name=
Android穩定性(二)bootup fail
android系統啟動簡單流程 1 bootloader啟動 開機供電,硬體電路會產生乙個確定的復位時序用於硬體啟動順序,直至最後cpu啟動 cpu開始執行第一條指令,該指令所在的記憶體位址是固定的,這個固定記憶體位址儲存的程式就是bootloader,常用的就是u boot,其作用就是拉起作業系統...
mysql穩定性 MySQL的穩定性
isam表處理器 穩定 它管理所有在mysql 3.22和早期版本中的資料的儲存和檢索。在所有mysql版本中,中已經沒有乙個單獨 報告的 錯誤。得到乙個損壞的資料庫表的唯一已知方法是在乙個更新中途殺死伺服器,即使這樣也不大可能破壞任何資料而不能挽救,因為所有資料在每個查詢之間被倒入 flush 到...
Android 系統穩定性 ANR(三)
android anr穩定性 android應用程式的所有標準元件全部執行在乙個單一的主線程中,在主線程中所做的任何耗時的操作都有可能造成anr,因為這些耗時的操作會使得主線程沒有機會處理使用者輸入事件或者廣播事件。因此在主線程中執行的任何函式所做的工作都應該盡可能的少,特別是對於activity的...