精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

聊聊嵌入式軟件的問題分析

開發 架構
實現一個復雜功能,或者解決某個問題,往往可以在不同的子系統解決,各個子系統出于各自原因,都希望最終的解決方案不要放到自己的子系統,希望推到其他子系統。

1 問題背景

一切為了進度,軟件開發的首要目標就是以最快的速度滿足客戶需求,“快”是第一要素,但是短期指標;可復用性、擴展性等長期指標被忽略,導致后期的維護、功能增減調整都非常困難。一個小的業務需求會牽一發而動全身,一個小的故障修復可能引入更多的問題。整個系統包袱越來越沉重,軟件的質量和開發周期越來越不可控。

排除軟件開發人員的水平和項目進度的原因,主要影響因素還包括軟件架構,和軟件缺陷的修復能力。對于量產軟件,架構問題是先天性的,后期很難大改,只能前期預防;軟件缺陷問題是無法避免的,只能期望快速修復。

2 軟件架構問題

2.1 軟件架構的特點

1)承載力

正如一艘船最多能裝多少人,從軟件方面來說是軟件架構能承載多少業務或功能需求,當然,這需要架構師一開始架構系統的時候,就需要有一定的預見性。但也沒必要為了極小概率事件增加過多的冗余。

2) 易用性

易用性決定了軟件的整體開發效率,好的架構會讓團隊成員容易上手,子系統容易對接,開發效率高,各模塊和子系統的編寫只需要關注系統的設計和編碼工作,其他模塊間通信方面的事情架構可以提供很好的兼容。

3)擴展性

一個水杯除了用來喝水,也可用來喝酒,適應不同場景,在一定范圍內滿足不同的需求,是非常有必要的。軟件架構也是這樣,要新增更多的功能就要具備更高的擴展性。可擴展性的關鍵就在于新增部分不能影響其他,如果增刪導致系統整體使用異常,那么這個架構的可擴展性就很差。

4)伸縮性

伸縮性就是設計的方案或系統是否可以根據需求適配不同數量的功能或子系統,在我們設計的軟件系統中,架構的可伸縮性決定了架構的可適配性,例如,當硬件資源不足時,可以調整配置如flash的空間分配,支持減少一些服務但仍能正常運行。

5)容錯性

軟件運行中的異常,如用戶的非法操作,或者軟件本身的小缺陷導致整個系統無法使用,那這個架構容錯性就很差。軟件中的一些缺陷無法避免,但是我們應盡量保證這個缺陷的影響范圍最小。倘若出現系統無法使用的情況,應該有備份方案,比如自動重啟或者自動恢復數據等功能,也應該能夠讓開發人員及時知道問題的發生,以及問題所在的位置并記錄錯誤信息。

在架構設計中,以上五項基本能力缺一不可,某項能力的突出并不能帶動其他項,如果某一項能力比較弱,隨著時間的推移,問題會越來越大,甚至系統崩潰。就像木桶原理那樣,一個木桶的容量不是取決于最長的那根木板,而是取決于最短的那根。

2.2 如何規劃軟件架構

2.2.1 必須熟悉業務

軟件是為業務服務的,業務才是“目的”,軟件系統是為了達成業務系統目標的手段和方法。適應當前的業務需求是基礎,充分考慮和預測未來的業務擴展,根據業務的擴展性來設計軟件的擴展性。如果可預見未來沒有擴展重大新業務的需求,那么相應的軟件架構就沒有必要采用高擴展的軟件架構。比如嵌入式的傳感器數據采集小設備,就沒有必要把云計算等,業務范圍不沾邊的技術點放到其中。軟件架構必須以服務業務為核心思想,不熟悉當前軟件業務、和未來業務的擴展的架構師是很難設計出好的軟件架構。

2.2.1 借鑒業內成熟的架構

不照搬,并不意味著不要借鑒。借鑒業內成熟的軟、硬件架構是相對穩妥、高效的做法。以業內的架構為基礎,根據自身業務的特點,進行適配、裁剪和增加新的功能。熟悉業內常規的、成熟的、最新的軟件架構是架構師的一項基本功。但熟悉并不是意味著必須立即在目標系統中實施這些軟件架構。

2.2.3 采用設計模塊

設計模式(Design pattern)代表了最佳實踐,設計模式是軟件開發人員在開發過程中對一般問題的解決方案;是一套被反復使用的、多數人知曉的代碼設計經驗的總結,經過相當長的一段時間的試驗和錯誤總結出來的。

使用設計模式是為了重用代碼、讓代碼更容易被他人理解、保證代碼可靠性,合理地運用設計模式可以完美地解決很多問題。每種模式在現實中都有相應的原理來與之對應,每種模式都描述了一個在我們周圍不斷重復發生的問題,以及該問題的核心解決方案,這也是設計模式能被廣泛應用的原因。

用設計模式構建一個新的軟件模塊時,短期會讓人感覺有多此一舉的味道;但中長期來看,設計模式能夠克服“壞”架構的特征。學習這些模式有助于經驗不足的開發人員通過一種簡單快捷的方式來學習軟件設計。

2.2.4 合理的橫向和縱向切分

橫向切分 :從硬件、驅動、組件到業務層,軟件分層隔離。如數據通信:PHY/MAC/IP/TCP/應用層

縱向切分 :根據業務處理流程的環節縱向切分,不同的環節為不同的模塊,不同的業務功能為不同的模塊,如socket網絡、GNSS衛星定位。

2.2.5 按樹形結構組織

按照樹形結構的方式組織軟件系統,不同的大功能拆分為小功能,文件夾內套文件夾的實現形式,命名上統一,方便按功能快速找到對應的源碼。

2.2.6 降低模塊之間的耦合度

耦合性是一種軟件度量,是指一程序中模塊及模塊之間信息或參數依賴的程度;內聚性是一個和耦合性相對的概念,一般而言低耦合性代表高內聚性,反之亦然。

2.2.7 降低模塊與模塊之間通信

一個軟件內模塊與模塊之間的通信,構成了一個內部的通信網,避免內部模塊的通信采用網狀結構,這種解決方案是設計模式中的中介者模式。

2.3 重構和演進架構

架構不能一成不變,要隨著業務需求的演進而升級重構,一成不變的架構是危險的,總有一天架構成為業務演進的最嚴重的制約因素。

這種需要實際開發中除完成既定的項目外,預留部分人力進行架構升級維護,持續小改動,不定期根據業務的需求進行架構的重構,未雨綢繆。

3 軟件問題的分析與解決

嵌入式軟件由于調試手段的限制、部署場景的多樣化、軟硬件問題混合在一起、外部環境因素的影響等因素,導致軟件經常會遇到一些非常難以解決的問題。

3.1 解題思想

熟悉軟件的業務流程:從業務的角度發現問題、復現問題并解決問題。

熟悉軟件的總體架構:軟件架構是解決難題問題的基本框架,基于軟件架構解決問題不會陷入到局部細節,導致修復一個問題的同時產生新的問題,不會犯原則性、方向性錯誤。

熟悉軟件代碼的實現:熟悉代碼的細節,能夠更好、更快的在蛛絲馬跡中找到證據和突破點,甚至在問題還沒有收斂前,提供一種收斂的方向,引領問題的解決,對代碼的熟悉程度直接關系到解決問題的速度。

3.2 調試手段和信息不足相關問題

3.2.1 現場偶發性、難復現性引發的問題

一些偶發性現象級問題,甚至導致系統偶發性的重啟,無法復現,設備重啟之后,故障消失后,再也很難復現。

1)分析日志文件

從log中尋找異常提示,是應對不可重復性、偶發性故障最基本的手段。在系統某處發生異常時,一定會在log中留下蛛絲馬跡,可以請客戶協助提供串口日志,在log文件中查找問題。或者設備自己內部記錄log,但嵌入式設備由于存儲空間的限制,可能先前過于久遠的信息,就會被新的信息被覆蓋,針對這種情況,就需要定期清除無效日志。有些異常會導致系統重啟,而重啟之后,就會導致異常信息被正常重啟的信息覆蓋,這就需要系統能夠支持log的備份。不管怎么樣,log為定位現場問題提供了最基本的、最主要的信息來源。一個完善的log機制,對于定位現場問題非常有幫助。如果不滿足,可能首要任務是先完善日志功能。

2)回退軟件版本,緊急消除現場問題

有些現場問題,雖然偶發事件,但發生后影響嚴重,客戶無法接受。針對這種情況,在解決問題之前,可以先把軟件降級,降級到相對穩定,沒有嚴重故障的版本。

3)比較相鄰版本之間的代碼改動

如果不容易復現的故障,確認在升級了某個軟件版本之后才出現的,而其他現場條件都沒有變化,且分析log也無法發現異常點。此時,一種高效的解決此問題的方法,就是比較兩個版本之間的代碼的改動。

代碼改動比較少,分析代碼比較容易;如果代碼改動比較多,就需要根據用戶描述的現象,結合前后代碼的改動模塊,初步分析最可能是哪個模塊引起的,這種往往需要對系統架構較深刻的理解。在眾多修改模塊中,分析最有可能關聯的代碼模塊的改動,然后逐一排查 。分析代碼的改動與出現的現象之間可能的關聯關系,對開發人員個人的技術素養和方法論有較高的要求 。比較相鄰版本之間的代碼改動,針對某些棘手的現場問題,有時候確實是一個非常有效的手段。

4)問題復現

雖然常規來說現場很難復現,但可以人為的修改軟件、構建或增加模擬數據,人為創造或觸發條件,增加故障復現的幾率。在設計觸發條件時,需要圍繞用戶描述的現場故障現象來設計觸發條件,觀察是否能否復現,且表現一致。

5)分析代碼

根據用戶描述的現象,硬分析代碼,是一種通用的方法,放之四海皆準的方法,熟悉自身代碼的邏輯關系是基本功,但解決問題的效率就比較難把握了。

6)增加 log 更新版本繼續測

如果常規的log無法展現故障的異常,就需要在猜測有可能的部分增加日志,在現場復測。但這種日志添加的位置是否合理,決定了問題再次出現時是否能定位問題的準確性。這種方法在工程實踐中,實施難度大,需要客戶多次配合。

3.2.2 現象與真正的原因不在一起的問題

大多時候解決軟件故障,是可以做到頭痛醫頭,腳痛醫腳。有些時候,頭痛的原因并不在“頭”,而在“腳”。這就需要知道“頭痛” 與 “腳” 的某種關聯關系。

解決這樣的問題,對技術人員的綜合技能的要求非常高,因為這個問題,不再是局部問題,而是發散到調查該問題的技術人員不熟悉的其他的軟件組件領域。即使對于熟悉整個系統的人而言,也是一個難點,因為問題的現象與根源之間的路徑是發散的,沒有一個確切的路徑。

首先,必須以故障的表面現象作為錨點,作為出發點。為后續進一步的調查立一個基點。根據現象找到出問題的代碼,根據代碼和log分析代碼的表面原因。如果確實是本處代碼的問題,直接在此解決即可。即頭痛醫頭,腳痛醫腳。

很多情形下,真正的原因不在顯示異常的地方,比如收到了異常的事件、或參數不合理、或自身狀態機的問題等。這時候就需要追溯,為什么會有這樣的事件或消息?有時候,由于復雜系統的程序員沒有系統的視角,常以為消除了故障表面現象就是解決了問題。很多時候站在系統的視角,可以從多個層面加以解決,消除異常事情,可以從規則過濾模塊解決,也可從前置模塊或后續模塊解決。具體在哪兒解決最合理,這就需要有系統和結構的視角。當然,也曾遇到有人解決類似問題是屏蔽異常消息或者屏蔽ASSERT,并沒從根源去消除為什么產生了異常。

3.2.3 報錯點發生在第三方庫內部

軟件報錯的地方是在第三方庫,而第三方庫有沒有源代碼或不熟悉

如果集成的第三方庫沒有源代碼,則把這個問題上報給第三方,讓第三方給出內部出錯的原因,更新庫或者配合抓日志分析。如果第三方庫有源代碼的話,可分析第三方代碼,增加日志或檢查傳入第三方庫函數的參數是否正確,是否合法;大多數時候,是錯誤地傳入了不合適的參數給第三方庫。檢查使用第三方的時序是否正確,在軟件系統中,時序是一個非常重要,同樣的函數,同樣的代碼,如果時序不對,也會導致代碼邏輯紊亂。不過現在提供庫或者SDK,一般都有技術支持,也可直接尋求幫助。

3.2.4 軟硬件結合導致的無法定位的問題

在嵌入式系統中,有時候會出現硬件異常導致軟件狀態或邏輯錯誤,硬件人員很難根據有限的信息判斷硬件到底怎么了,通常軟件和硬件就會反復的踢皮球。但是用戶角度看到的異常是在軟件這邊。

由于硬件團隊對客戶現場的設備,通常沒有檢測手段來判斷是否真是硬件問題的,軟件團隊最好能夠通過日志配置,確認硬件故障單元。或者直接將壞機寄回硬件部門,軟件配合復現問題,以幫助硬件團隊判斷。

硬件故障問題,需要特別關注供電、時鐘信號,復位時間等,曾經遇到幾次因為串口漏電出去導致外部傳感器復位異常的問題。總之,軟硬件的交合處,是容易扯皮的地方,這需要軟件人員也同時了解硬件的工作原理,在出故障時,能夠更好的判斷是軟件異常,還是硬件真的有故障。

還有一個商業上的問題,如果客戶感受到是硬件的問題,需要回收設備,會造成很大的經濟損失。一般情況下是軟件想辦法規避異常,畢竟軟件復制不需要成本。

3.3 內存與指針相關問題

3.3.1 隱性的內存泄露問題

內存泄漏(Memory Leak)是指程序中已動態分配的堆內存由于某種原因程序未釋放或無法釋放,造成系統內存的浪費,導致程序運行速度減慢甚至系統崩潰等嚴重后果。內存泄露是一個嚴重的慢性病,不會立即展現,但不知道未來的哪一天,所有的設備,會在相近的時間點爆發問題。

內存泄漏還會導致系統意外的重啟,重啟的原因可能千奇百怪。因此,檢測和解決內存泄漏,就顯得非常重要。

1)泄漏的原因

內存泄漏主要是發生在堆內存分配方式中,即malloc方式中,申請的內存沒有得到釋放,或者對應的指針被被覆蓋,內存直接泄漏。因為內存泄漏屬于程序運行中的問題,無法通過編譯識別,主要在程序運行過程中來判別和診斷。

2)動態檢測或監控是否內存泄露

監控系統內存,周期性監控堆中可用內存的大小,是檢測系統是否有內存泄漏的最有效的手段。系統的內存短期會隨著業務數據的變化而變化,但長期來看,可用的剩余可用內存會圍繞一個中軸線上下波動,如果存在內存泄漏,其剩余可用內存隨隨著時間的推移逐漸減少。

3)如何找到在哪兒內存泄露

可以使用工具檢測代碼中有沒有靜態的內存泄露,也可以在代碼中增加標記,檢測長期未釋放的堆是誰申請的,在代碼中查找。可以參考文章《動態內存管理及防御性編程》。

3.3.2 指針跑飛的問題

指針跑飛就是指針指向不正確的位置,指針未初始化或數組/指針越界訪問,導致系統崩潰。

指針跑飛是常見的問題,問題很嚴重,但解決起來其實并不難,指針跑飛系統crash時,如果平臺軟件會打印出函數調用棧、segment fault錯誤、代碼出錯的地方、coredump文件等信息。有了這些信息,再分析源代碼,其實是很容發現或找出當前代碼中指針跑飛的原因的。

如果基于第三方的SDK開發,指針跑飛直接就重啟,可能不會有任何提示,因此,最好能夠在編碼時就能夠提前預防,而不是等待程序跑飛之后再定位解決 。常見的手段:

1)熟悉和遵守代碼編寫規范,加強代碼的評審,把問題消滅在編碼階段。

2)靜態檢測工具對代碼進行檢測。

3)增加邊界性測試用例,一般指針異常是在邊界或異常情形下發生的。

4)增加異常場景的測試,異常場景是違反常規的測試場景,這些異常業務場景,能夠盡早shi發現隱藏的問題。


3.3.3 空指針的問題

空指針是“指針跑飛”的一種特殊情況,即指針為NULL,通常出現在指針用NULL值初始化后,在某些情況下沒有給指針賦值,就直接使用指針范圍內存。或者接收函數返回的指針變量,忽略了函數返回NULL的情形。

在使用指針前,檢查指針是否為空,如果為空,在代碼中執行異常處理流程,如打印出錯信息,或者ASSERT,這樣就可以避免引起更嚴重的問題,相對來說多使用一個if即可規避。

3.3.4 棧溢出導致的問題

棧溢出時會訪問不存在的RAM空間,造成代碼跑飛,這時無法得到溢出時的上下文數據,也無法對后續的程序修改提供有用信息。

函數遞歸調用,系統要在棧中不斷保存函數調用時的現場和產生的變量,如果遞歸調用太深,就會造成棧溢出。函數內局部數組變量的內存空間過大,或者局部數組變量的下標范圍溢出,破壞了棧空間中的內容。這種問題容易解決但初始不容易查到原因。如果是帶操作系統的,一般系統內核會直接提示棧空間不足,將任務棧空間加大,或者不靜態分配,用malloc動態創建,從堆中分配的。平時編碼中禁止使用循環遞歸函數。

3.4 軟件時序設計相關的問題

時序問題是最容易出問題的地方,“時”代表時間順序和時效性,一旦執行順序錯亂,或執行過慢失去時效,就會導致錯誤。

3.4.1 消息的串行化處理

每個任務、線程,只能按順序的處理串行的消息,然而,其他線程發送過來的消息并不是串行發送的,不同線程都是并行、異步發送消息的,這會導致線程在沒有處理完一個消息,另一個消息又回來了。如何把外部的并發消息轉換成線程的串行處理呢?

每個任務、線程都應有一個消息隊列,外部線程向消息隊列中發送數據,目標線程從消息隊列中讀取消息,這樣所有的消息被串行在消息隊列中,線程就會串行的處理每個消息,只有當一個消息處理完(函數調用返回)時,才會處理另一個消息。

3.4.2 超時或消息丟失引發的問題

一個任務、線程給另一個任務、線程發送消息,等待對方的應答,有時候對方忙,發送時隊列滿發送失敗,或者接收方沒有處理回復,等待一段時間后空閑了才處理該消息并應答時,但對于發送方已經超時。發送方超時,就需要進入異常處理。這里容易出問題,它可能會引發一連串的異常處理反應,也有可能影響后續的正常消息的處理。

消息丟失是必須考慮情況,發送方不能假設接收方一定能夠收到消息,也不能假設接收方一定能夠及時的回應,必須充分考慮到消息因為傳輸的問題丟失或對方忙,沒有及時回應的情形。

消息丟失就容易產生理論上該執行的動作沒有執行,或者消息里面動態內存未釋放。或者消息處理慢導致對外設的控制延遲產生異常,曾經出現共享單車鎖里面的馬達停止消息處理不及時導致車鎖無法再次上鎖。尤其處理通信時序要求嚴格,或外設控制要及時的場景需要注意。

3.4.3 性能本身問題

數據處理尤其是復雜算法耗時,導致消息處理不及時,最終對外設的控制或者通信交互時序狀態延遲,產生異常。這種只能優化算法,或對時序部分單獨特殊處理,不考慮設計模式保執行效率。或者評估階段就選擇性能資源更佳的硬件方案。

3.5 異常處理不充分問題

軟件設計一般是考慮正常流程,然而實際運行中,并非是理想狀態,系統總會遇到各種異常,健壯的系統,能夠充分考慮到各種異常情況,一旦異常發生,程序也不會輕易崩潰。

超時:增加超時定時器事件以及事件處理,不能假設對方一定應答消息。

空指針:不能假設一定能夠申請到內存,要考慮到返回為NULL的情形,通過指針訪問內存對象時需要及時的檢查指針是否為空。

并發訪問:在并發執行的系統中,如果要訪問全局變量,不能假設只有一個線程訪問全局變量,需要通過鎖對全局共享資源進行加鎖,特別是要訪問全局的數據結構。

消息隊列:不能假設消息隊列始終有效,要考慮消息隊列滿或空的情形。

設計:在軟件設計時就考慮軟件的異常處理機制,功能層面就支持異常記錄、售后調試的需求,而不是把這個工作留給編程人員。

4 非技術性問題

大規模系統中軟件會分割成無數個模塊,負責這些的開發人員來自不同的職能部門,這些部門又有著各自不同優先級的任務,而解決那些復雜的問題又需要這些部門的配合,才能找到真正的出錯原因和找到最終的解決方案。或許最終解決問題的代碼僅僅在一個組件中,或許只有簡單的一兩行代碼,然而找到問題的原因并給定解決方案的過程卻是漫長、繁瑣的。

4.1 人員分配

在大規模分工的系統中,每個技術領域都是一群人負責,解決問題效率與個人的技術能力有極大的關系。有些簡單技術問題,如果參與的不是合適的技術人員,例如人員的變動導致原來的軟件人員不再負責該軟件,那簡單的問題也變得復雜。正所謂“難者不會,會者不難”。技術是長期積累的過程,同一類問題不要頻繁的更換人員。

4.2 任務分配

復雜系統中,一個問題需要涉及到多個部門,一個程序員在某個環節上的放緩,導致基于這個前置條件的進度也跟著放緩,整個組織的執行就會極大的降低,從宏觀上看,整個組織都很忙,但總體的效率卻很低。

按優先級排序分配任務,在一個高優先任務完成前,不要處理其他任務,降低程序員并發處理故障的個數,否則“任務”切換的開銷就很大。高難度與低難度任務搭配,同時處理多個高難度問題,整體效率是下降的,而且一個延期會連鎖導致后續都延期。

4.3 項目分配

實現一個復雜功能,或者解決某個問題,往往可以在不同的子系統解決,各個子系統出于各自原因,都希望最終的解決方案不要放到自己的子系統,希望推到其他子系統。此時,一般是地位低的子系統人員妥協,即使其子系統的實現不是最佳方案,這種就看項目分配,需要具有一定技術背景和決策權的人協調。

5 結語

關于軟件問題的分析理論,也只是拾人牙慧。理論和實際存在較大差異,真正遇到軟件問題,這些方法并不一定靠譜。

責任編輯:武曉燕 來源: 嵌入式系統
相關推薦

2023-04-27 07:06:18

2023-01-04 09:37:16

2022-12-14 08:06:08

2011-04-18 11:34:34

嵌入式軟件測試

2023-07-16 22:48:59

2010-01-06 09:53:08

嵌入式

2015-05-07 10:10:28

嵌入式設計軟件

2023-11-29 07:51:40

嵌入式軟件設計

2009-12-22 17:46:56

Fedora 9嵌入式

2018-03-12 16:18:31

嵌入式開源

2018-04-08 16:26:48

2010-01-19 09:08:46

嵌入式Windows Emb

2023-01-27 23:46:36

嵌入式軟件技巧

2011-02-22 17:12:40

2012-03-05 15:45:32

嵌入式開源軟件

2022-04-13 09:34:52

軟件開發嵌入式軟件

2011-05-24 17:34:38

嵌入式系統

2022-01-10 23:43:50

嵌入式軟件開發工具

2009-07-21 08:59:11

嵌入式系統軟件

2011-01-14 13:13:23

嵌入式Linux開發
點贊
收藏

51CTO技術棧公眾號

日韩国产欧美一区| 日本老师69xxx| 超级砰砰砰97免费观看最新一期 | 蜜桃视频网站在线| 国产一区二区调教| 韩国福利视频一区| 欧美人与性囗牲恔配| 国产电影一区| 色综合视频一区二区三区高清| 国产精品自产拍在线观看中文 | 国产情侣小视频| 欧美日韩一区二区综合| 91精品黄色片免费大全| 91九色在线观看视频| 婷婷激情在线| 久久久久久久久久久黄色| 91免费综合在线| 久久久久99精品成人片三人毛片| 美女呻吟一区| 欧美日韩一区三区| heyzo国产| av免费在线免费观看| 久久久久9999亚洲精品| 国产精品久久久久久久小唯西川| 青青草成人免费| 国产探花一区二区| 亚洲国产精品成人精品| 99热这里只有精品在线播放| 成全电影大全在线观看| 中文字幕一区二区不卡| 人禽交欧美网站免费| 日本高清视频免费观看| 精品一区二区三区在线播放| 日韩美女免费视频| 日本熟女一区二区| 欧美fxxxxxx另类| 这里只有精品视频| 播金莲一级淫片aaaaaaa| 亚洲精品观看| 777亚洲妇女| av污在线观看| 国产一区二区精品调教| 日韩欧美亚洲成人| 男女啪啪免费视频网站| 日韩电影免费观看| 亚洲免费观看高清完整版在线观看熊 | 丝袜美腿高跟呻吟高潮一区| 欧美—级a级欧美特级ar全黄| 老熟妇精品一区二区三区| 日本免费一区二区三区等视频| 亚洲精品国产高清久久伦理二区| 超碰在线97av| 精品人妻无码一区二区| 精品在线免费观看| 91久久精品一区| 97人妻精品一区二区三区软件 | 欧美激情国产精品| 国产中文av在线| 91精品国产91久久久久久密臀| 欧美mv日韩mv| 原创真实夫妻啪啪av| 高清一区二区| 日韩亚洲欧美在线| 美女搡bbb又爽又猛又黄www| 综合欧美亚洲| 亚洲第一网站男人都懂| 精品无码在线视频| 蜜桃视频欧美| 精品国产依人香蕉在线精品| 日韩欧美综合视频| 亚洲天堂偷拍| 55夜色66夜色国产精品视频 | 飘雪影院手机免费高清版在线观看 | 国产av一区二区三区| 国产麻豆精品视频| 大波视频国产精品久久| 神马一区二区三区| 国产校园另类小说区| 婷婷四月色综合| 国产福利在线播放麻豆| 亚洲图片自拍偷拍| 久久久久久久久久久久久国产精品| 午夜视频在线观看网站| 国产精品久久久久久久久快鸭| 久久久人人爽| av在线免费观看网| 亚洲蜜臀av乱码久久精品| 国产欧美久久久久| 一二三四视频在线中文| 欧美美女一区二区在线观看| 最好看的中文字幕| 外国成人在线视频| 精品国偷自产在线| 天天插天天操天天干| 日韩成人av影视| 亚洲自拍小视频| 亚洲三级黄色片| ...中文天堂在线一区| 精品少妇人欧美激情在线观看| 免费超碰在线| 精品国产1区2区| 精品久久久噜噜噜噜久久图片| 蜜桃av.网站在线观看| 欧美在线观看视频一区二区| 男人女人拔萝卜视频| 伊人春色精品| 欧美激情亚洲国产| 亚洲高清在线看| 岛国一区二区在线观看| 亚洲精品日韩精品| 黄色视屏在线免费观看| 欧美日韩国产三级| 精品熟女一区二区三区| 天天插综合网| 国产成人精品av| 姝姝窝人体www聚色窝| 中文字幕一区二区视频| 97视频在线免费播放| 999精品视频在这里| 一区二区亚洲欧洲国产日韩| 丰满少妇乱子伦精品看片| 国产一区 二区 三区一级| 区一区二区三区中文字幕| 国产资源在线观看入口av| 91精品欧美综合在线观看最新| 一级黄色高清视频| 欧美精品乱码| 日本国产一区二区三区| 色呦呦中文字幕| 亚洲男人的天堂网| 精品久久久99| 日韩中文在线电影| 国产精品精品久久久| 色av男人的天堂免费在线| 亚洲最新视频在线播放| 手机精品视频在线| av亚洲免费| 国产99在线|中文| 五月天婷婷在线观看| 亚洲一区二区三区四区在线免费观看| 男女激情无遮挡| 中文字幕一区二区三区日韩精品| 亚洲成avwww人| 污软件在线观看| 国产综合一区二区| 一区二区三区四区欧美日韩| 欧美成人ⅴideosxxxxx| 亚洲毛片一区二区| 9i看片成人免费看片| 91色在线porny| 免费在线激情视频| 亚洲国产欧美日韩在线观看第一区| 色婷婷综合久久久久| 日本精品入口免费视频| 国产日韩欧美精品电影三级在线| 337p亚洲精品色噜噜狠狠p| 91精品一久久香蕉国产线看观看| 欧美精品一区二区久久婷婷 | 狠狠躁夜夜躁av无码中文幕| 亚洲欧美一区二区三区极速播放| 无码中文字幕色专区| 国产精品115| 2020欧美日韩在线视频| 巨骚激情综合| 欧美日韩一区二区三区四区 | 亚洲人成伊人成综合网小说| 污污视频网站在线| 一区二区在线| 国产在线精品日韩| 性国裸体高清亚洲| 少妇高潮久久77777| 99这里有精品视频| 亚洲国产精品久久艾草纯爱| 国产精品无码毛片| 奇米精品一区二区三区在线观看一 | 久久久久女人精品毛片九一 | 日本黄色片在线播放| 久久这里有精品15一区二区三区| 亚洲xxx大片| 69av成人| 一区二区中文字幕| 国产哺乳奶水91在线播放| 亚洲成人免费观看| 一二三四在线观看视频| 国产+成+人+亚洲欧洲自线| 欧美色图另类小说| 欧美影院三区| 成人欧美一区二区三区视频| 亚洲黄色免费看| 正在播放欧美一区| 国产极品久久久| 色视频一区二区| 日本少妇高清视频| 久久亚洲精精品中文字幕早川悠里| 国产情侣第一页| 深爱激情久久| 成人动漫在线视频| 电影亚洲一区| 欧美激情综合色| 69视频在线观看| 亚洲国产小视频在线观看| 亚洲天堂网在线视频| 亚洲国产精品一区二区久久恐怖片 | 日韩av不卡播放| 免费欧美网站| 国产精品户外野外| 国产一线二线在线观看| 国产一区二区三区网站| 亚洲欧美黄色片| 欧美日韩免费一区二区三区| 一级片免费网址| 国产精品久久久久久久裸模| 91丨porny丨对白| 国产一区在线看| 在线观看av日韩| 性色一区二区三区| av网站手机在线观看| 91成人观看| 亚洲一区三区视频在线观看| 秋霞影院一区二区三区| 91香蕉视频在线下载| 黄色成人小视频| 国产精品69久久| 日韩伦理精品| 97精品欧美一区二区三区| 丝袜美腿av在线| 神马久久桃色视频| 大片免费播放在线视频| 日韩精品视频在线| 高潮毛片7777777毛片| 欧美一区二区网站| 91极品身材尤物theporn| 色婷婷av一区二区三区gif| 欧美精品亚洲精品日韩精品| 夜夜嗨av一区二区三区中文字幕| 国精产品一区一区三区免费视频| 日韩电影在线观看电影| 日本一区二区黄色| 亚洲激情不卡| 免费看国产曰批40分钟| 亚洲福利精品| 超碰成人免费在线| 亚洲高清二区| 国产精品国产亚洲精品看不卡| 亚洲系列另类av| 久久av一区二区三区漫画| 欧美日韩导航| 久久久久久久久久久久久久一区| 亚洲日本网址| 国产精品九九九| 日韩精品三区| 国产福利成人在线| jizz亚洲女人高潮大叫| 国产欧美在线观看| 成人在线日韩| 亚洲一区二区少妇| 亚洲精品一区二区三区中文字幕| 国产激情久久久久| 亚洲成人人体| 国产精品美女在线| 国产精品久久久久久久久久辛辛 | 精品这里只有精品| 在线视频精品| 久草综合在线观看| 日韩va亚洲va欧美va久久| 国产 porn| 国模无码大尺度一区二区三区| 99热成人精品热久久66| 日韩经典一区二区| 99re6在线观看| 粉嫩aⅴ一区二区三区四区| 中文字幕天堂网| 国产亚洲精品福利| 中文字幕观看av| 亚洲成人综合在线| 蜜臀尤物一区二区三区直播| 欧美精品一卡两卡| 精品国精品国产自在久不卡| 亚洲国产精品yw在线观看| xxxxx日韩| 欧美激情精品久久久久久久变态 | 激情成人中文字幕| 好看的av在线| 91麻豆精品国产91久久久使用方法 | 性刺激综合网| 欧美激情麻豆| 一本大道熟女人妻中文字幕在线| 欧美日韩调教| 99热成人精品热久久66| 久久99久久久久久久久久久| 韩国三级视频在线观看| 久久精品综合网| 精品97人妻无码中文永久在线| 中文字幕在线观看不卡视频| 2021亚洲天堂| 在线观看一区日韩| 丰满少妇高潮在线观看| 一区二区三区黄色| 国产黄色大片在线观看| 国产精品视频在线播放| 久久久久久毛片免费看| 在线视频福利一区| 久久精品日产第一区二区 | 日本免费久久| 91九色单男在线观看| 综合色就爱涩涩涩综合婷婷| 中文字幕在线亚洲精品| 久久国产精品99国产| 日本中文字幕有码| 国产精品私人自拍| 久久久国产精品成人免费| 91精品国产91久久久久久一区二区 | 日韩经典中文字幕一区| 欧美极品jizzhd欧美仙踪林| 国产精品三级视频| 日韩成人免费观看| 日韩一区二区免费电影| 91视频在线观看| 日本精品久久久| 国产精品三p一区二区| 欧美喷潮久久久xxxxx| 国产黄色录像视频| 视频在线观看一区| 国产性猛交96| 亚洲精品成人在线| 96亚洲精品久久久蜜桃| 国产一区二区久久精品| 在线观看特色大片免费视频| 国产精品v欧美精品∨日韩| 一个色综合网| www.亚洲自拍| 亚洲欧洲日本在线| 91精品人妻一区二区三区果冻| 欧美日韩高清一区二区三区| 五十路在线视频| 欧美高清自拍一区| 精品中文在线| 樱空桃在线播放| 激情成人综合网| 少妇高潮在线观看| 911精品产国品一二三产区| 欧美精品电影| 91老司机在线| 午夜精品久久99蜜桃的功能介绍| 日韩精品xxxx| 91首页免费视频| 欧美激情亚洲综合| 国产婷婷成人久久av免费高清| 日本激情视频在线观看| 国产精品wwwwww| 日本精品黄色| 一二三av在线| 亚洲综合999| 天天射天天色天天干| 欧美中在线观看| 国产a久久精品一区二区三区| 今天免费高清在线观看国语| 国产一区二区在线观看视频| 黄色一级免费视频| 亚洲国产99精品国自产| 性感女国产在线| 亚洲一区精彩视频| 极品少妇一区二区| 久久一级黄色片| 亚洲老头同性xxxxx| 日本精品网站| 51xx午夜影福利| 成人av网址在线观看| 伊人中文字幕在线观看| 最近的2019中文字幕免费一页| 亚洲一区站长工具| 日韩在线电影一区| 久久精品免费看| 免费无码毛片一区二区app| 亚洲精品久久久久久下一站 | 国产精品水嫩水嫩| 91成年人视频| 高清一区二区三区四区五区| 校花撩起jk露出白色内裤国产精品| 欧美xxxx吸乳| 成人激情文学综合网| 亚洲欧美日韩激情| 久久亚洲精品国产亚洲老地址| 国产成人亚洲一区二区三区| 天天综合五月天| 91免费看片在线观看| 91成人国产综合久久精品| 97精品视频在线观看| 日韩精品一卡| 老熟妇精品一区二区三区| 欧美日韩在线播| 国产激情视频在线看| 亚洲一区二区三区免费看| 成人教育av在线| 亚洲怡红院av| 57pao国产精品一区| 亚洲香蕉av| 国产免费一区二区三区网站免费| 色中色一区二区| www在线观看播放免费视频日本|