修過的一個android framework原生系統代碼bug

“坑”描述:

在對我們自己研發的一款android終端進行camera拍照壓力測試時,發現當拍照張數達到幾萬張時,查看內存占用情況,發現內存泄露。

填“坑”:

frameworks/base/core/jni/android/graphics/YuvToJpegEncoder.cpp

bool YuvToJpegEncoder::encode(SkWStream* stream, void* inYuv, int width,int height, int* offsets, int jpegQuality) {jpeg_compress_struct    cinfo;skjpeg_error_mgr        sk_err;skjpeg_destination_mgr  sk_wstream(stream);cinfo.err = jpeg_std_error(&sk_err);sk_err.error_exit = skjpeg_error_exit;if (setjmp(sk_err.fJmpBuf)) {return false;}jpeg_create_compress(&cinfo);cinfo.dest = &sk_wstream;setJpegCompressStruct(&cinfo, width, height, jpegQuality);jpeg_start_compress(&cinfo, TRUE);compress(&cinfo, (uint8_t*) inYuv, offsets);jpeg_finish_compress(&cinfo);return true;
}

坑就在上面這個接口函數中:
熟悉libjpeg的同學會注意到,上面的接口在調用完jpeg_finish_compress()后,沒有調用jpeg_destroy_compress(),這個接口是釋放壓縮工作過程中所申請的資源,主要就是jpeg壓縮對象。
由于android原生接口中,沒有調用jpeg_destroy_compress()導致每次泄露幾十個字節,當拍照數量達到萬級時,才會有所察覺。

怎么找到這個坑的:

這個過程后面有時間會詳細寫下,目前心得就是模塊的架構十分重要,對這種數據流的控制,pipeline方式是比較好的方案,因為可以明確輸入輸出,然后通過偽造輸入輸出對各個模塊進行單獨的壓力測試。最難控制的就是“洋蔥”式的包裹調用,要像“剝洋蔥”一樣一層層的剝離十分麻煩。

你的android機上有這個問題嗎:

9成的概率下你的手機應該不會有這個問題,因為上面我講到是在我們做的一款終端上發現的問題,我們的終端芯片方案比較挫,沒有硬編碼模塊,導致使用了android的軟編碼方案,也就用到libjpeg這個模塊,也就觸發了上面問題函數接口的調用。

牢騷:

做底層系統開發就是這樣,一個bug耗費了很久的時間去測試,查找,驗證。一層層剝離模塊,逐步定位問題的大概位置,到最后精確定位問題,并解決,bug的解決可能就是一行代碼的事(上面就加上destroy接口即可),但著實耗費了不少時間,如果按照代碼行數計算kpi,這個performance應該是差的可以了。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/450237.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/450237.shtml
英文地址,請注明出處:http://en.pswp.cn/news/450237.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Koa項目搭建過程詳細記錄

2019獨角獸企業重金招聘Python工程師標準>>> Java中的Spring MVC加MyBatis基本上已成為Java Web的標配。Node JS上對應的有Koa、Express、Mongoose、Sequelize等。Koa一定程度上可以說是Express的升級版。許多Node JS項目已開始使用非關系型數據庫(MongoDB)。Sequel…

商業項目中代碼質量是否重要?

這是一篇比較老的 文章,但是文中的這些問題在現在仍然普遍存在。代碼質量的高低與商業產品的優劣是否有直接的影響?開發者Frank Sommers在文中給出了他的看法。文章內容如下。在大多數商業項目中,代碼質量并不被看重,因為大部分情…

Class is not a root resource. It, or one of its interfaces must be annotated with @Path:

前些天發現了一個巨牛的人工智能學習網站,通俗易懂,風趣幽默,忍不住分享一下給大家。點擊跳轉到教程。 報錯如題: Class is not a root resource. It, or one of its interfaces must be annotated with Path:XXXX 這是一個dub…

Equation漏洞混淆利用分析總結(下)

樣本三 如下所示在該樣本中,使用了Ole10Native的流,因此沒有equative head,默認讀取紅框中的4位長度。之后的metf head為01. 可以看到metf head的長度為01時,直接進入到if判斷中(該if中的函數實際是一個異常處理函數,但…

閑扯工程師的版本管理概念

如果你所在的公司還在通過qq給客戶發sdk升級包等,你可以考慮換一家公司了。

resource fork, Finder information, or similar detr

1.關閉當前項目和Xcode 2.打開終端或者iterm cd ~/Library/Developer/Xcode/DerivedData/ 3. xattr -rc . 4.重新打開項目 5.如果不行那你就再試試其他的辦法吧,我就是這樣弄好的 如果有需要裝系統的話可以看一下我自己封裝的系統,原裝系統無精簡&#x…

5 個常用的軟件質量指標

在軟件開發中,軟件質量是衡量軟件是否符合需求、標準的重要體現。除了 代碼質量外,影響軟件整體質量的因素還有很多。因此,要確保軟件的整體質量,就需要在各個環節嚴格控制。本文列出了衡量軟件質量的5個最常用的指標。1. SLOC&a…

介紹一個對陌生程序快速進行性能瓶頸分析的技巧

前言 工作多年,一直做的是curd系統。前幾年做的系統應用場景,大多對數據庫依賴比較重。例如報表統計,數據遷移,批量對賬等。所以這些系統出現性能瓶頸一般出在數據庫操作上面。 如果程序因為數據庫操作出現性能瓶頸是比較好辦的&a…

[WARNING] The POM for XXX-system:jar:1.9.0-SNAPSHOT is missing, no dependency information available

前些天發現了一個巨牛的人工智能學習網站,通俗易懂,風趣幽默,忍不住分享一下給大家。點擊跳轉到教程。 在 git-bash 中 想要啟動一個工程服務就是不成功,始終提示jar包找不到,本地代碼已提交。 這時可直接登陸git&am…

關于tcp網絡通訊的幾個場景的小測試

以下場景基于阻塞式IO 發送端向接收端快速的發送數據,接收端如果不接受或者很慢速的接受會發生什么情況。 發送端快速向接收端發送大量數據,然后立即退出,接收端會發生什么情況。

測試一體機ASM failgroup的相關問題處理

環境:3臺虛擬機 RHEL 7.3 Oracle RAC 11.2.0.4問題現象:RAC運行正常,ASM磁盤組Normal冗余,有failgroup整體故障,有failgroup配置錯誤。溫馨提示:本文并不是市場上任何一款商業的一體機產品,只是…

掌握窮變富的12條原則 迅速從普通人變成有錢人

“窮忙”和“富閑”是對立面,“窮”對“忙”,“富”對“閑”,很多“窮忙女”是在拿青春當賭注,希望自己今天的“美麗”明天就能在市場上有個不錯的“回報”;而多數“富閑女”則是在拿智慧當籌碼,既不可替代…

com.alibaba.dubbo.rpc.RpcException: Forbid consumer 192.168.184.1 access service com.foreveross.syst

前些天發現了一個巨牛的人工智能學習網站,通俗易懂,風趣幽默,忍不住分享一下給大家。點擊跳轉到教程。 報錯如下: com.alibaba.dubbo.rpc.RpcException: Forbid consumer 192.168.XXX.1 access service com.XXX.system.service.…

動手又動腦

1.編寫一個程序,指定一個文件夾,能自動計算出其總容量。 import java.io.File; import java.io.IOException; public class FileEdit { double size0.0; //計算文件或文件夾的大小,單位MB public double getSize(File file){ //判斷文件是否存…

windows下安裝和設置gradle

一、安裝前檢查 檢查jdk是否已經安裝 二、下載gradle 1. https://gradle.org/releases/ 2.設置gradle環境變量 3. 環境變量中增加名為GRADLE_HOME的變量名,值為Gralde的解壓路徑,例如D:\Gradle 在path的后追加%GRADLE_HOME%\bin; 4. 驗證 5.修改默認緩存目錄 修改Gradle默認緩存…

智能硬件的時代,嵌入式是否已經日薄西山

存吐吐槽,智能硬件現在很火熱,導致很多人以為嵌入式行業又迎來了春天,可是明白人都知道,智能硬件核心在智能,硬件是很次要的。目前的硬件產品,要有亮點,都和智能沾邊,已經不是那個可…

賺大錢一定要選擇

賺大錢一定要選擇 八大賺錢定律讓你賺翻天 許多人看起來已經步入小康了,但他們還說不上是真正的富人,從科學理財的觀念看,憑高收入和攢錢來實現富裕的思路完全是錯誤的,依靠攢錢,不僅多數人無法獲得最終的財務自由&…

深解微服務架構:從過去,到未來

http://www.uml.org.cn/zjjs/im... 微服務的誕生 微服務架構(MicroserviceArchitect)是一種架構模式,它提倡將單塊架構的應用劃分成一組小的服務,服務之間互相協調、互相配合,為用戶提供最終價值。每個服務運行在其獨立…

解決IntelliJ Idea中文亂碼問題、修改IDEA編碼

前些天發現了一個巨牛的人工智能學習網站,通俗易懂,風趣幽默,忍不住分享一下給大家。點擊跳轉到教程。 有兩種辦法可以修改 IntelliJ IDEA 的文件編碼(IDE 版本為 14.1.4) File->Settings->Editor->File En…

前端框架開始學習Vue(一)

MVVM開發思想圖(圖片可能會被縮小&#xff0c;請右鍵另存查看&#xff0c;圖片來源于網絡)定義基本Vue代碼結構1 v-text,v-cloak,v-html命令默認 v-text沒有閃爍問題&#xff0c;但是會覆蓋元素中原本的內容&#xff0c;插值表達式只會替換自己的占位符,<!DOCTYPE html> …