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

嵌入式軟件的問題分析

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

1 問題背景

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

排除軟件開發人員的水平和項目進度的原因,主要影響因素還包括軟件架構,和軟件缺陷的修復能力。對于量產軟件,架構問題是先天性的,后期很難大改,只能前期預防;軟件缺陷問題是無法避免的,只能期望快速修復。拋磚引玉,也可先參看《嵌入式軟件bug從哪來,怎么去》。

2 軟件架構問題

2.1 軟件架構的特點

1)承載力

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

2) 易用性

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

3)擴展性

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

4)伸縮性

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

5)容錯性

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

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

2.2 如何規劃軟件架構

2.2.1 必須熟悉業務

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

2.2.1 借鑒業內成熟的架構

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

2.2.3 采用設計模塊

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

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

用設計模式構建一個新的軟件模塊時,短期會讓人感覺有多此一舉的味道;但中長期來看,設計模式能夠克服“壞”架構的特征。學習這些模式有助于經驗不足的開發人員通過一種簡單快捷的方式來學習軟件設計。盡管設計模塊通常被有經驗的面向對象的軟件開發人員所采用,但是嵌入式軟件C語言也可以借鑒,參考《嵌入式軟件的設計模式(上)》,《嵌入式軟件的設計模式(下)》。

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開發,指針跑飛直接就重啟,可能不會有任何提示,因此,最好能夠在編碼時就能夠提前預防,而不是等待程序跑飛之后再定位解決 。常見的手段:

  • 熟悉和遵守代碼編寫規范,加強代碼的評審,把問題消滅在編碼階段。
  • 靜態檢測工具對代碼進行檢測。
  • 增加邊界性測試用例,一般指針異常是在邊界或異常情形下發生的。
  • 增加異常場景的測試,異常場景是違反常規的測試場景,這些異常業務場景,能夠盡早shi發現隱藏的問題。

3.3.3 空指針的問題

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

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

3.3.4 棧溢出導致的問題

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

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

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

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

3.4.1 消息的串行化處理

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

每個任務、線程都應有一個消息隊列,外部線程向消息隊列中發送數據,目標線程從消息隊列中讀取消息,這樣所有的消息被串行在消息隊列中,線程就會串行的處理每個消息,只有當一個消息處理完(函數調用返回)時,才會處理另一個消息。參考《嵌入式軟件的設計模式(上)》中的 第3.3節 “隊列模式”。

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

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

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

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

3.4.3 性能本身問題

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

3.5 異常處理不充分問題

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

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

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

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

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

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

4 非技術性問題

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

4.1 人員分配

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

4.2 任務分配

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

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

4.3 項目分配

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

5 結語

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

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

2023-05-04 00:27:40

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技術棧公眾號

av第一福利在线导航| 中文字幕黄色av| caoporn成人免费视频在线| 亚洲乱码国产乱码精品精的特点| 国产一区二区在线免费| 亚洲欧美精品久久| 亚洲综合色婷婷在线观看| 五月综合激情网| 日韩精彩视频| 国产浮力第一页| 亚洲视频播放| 在线视频中文亚洲| 无码人妻aⅴ一区二区三区玉蒲团| 激情图片在线观看高清国产| 2023国产精品| 成人欧美在线视频| 久久国产精品免费看| 日韩久久视频| 亚洲大尺度美女在线| 美女喷白浆视频| 青青草视频在线免费直播| 久久精品夜色噜噜亚洲a∨| 成人做爰www免费看视频网站| jizz国产免费| 色男人天堂综合再现| 亚洲国产97在线精品一区| 在线免费视频一区| 蜜桃av.网站在线观看| 亚洲色图.com| 日本高清一区| 色欲av伊人久久大香线蕉影院| 麻豆国产精品一区二区三区 | 朝桐光av一区二区三区| 欧美日韩破处视频| 欧美日韩中文在线观看| 免费cad大片在线观看| av在线电影播放| 99久久综合精品| 亚洲最大的成人网| 一区二区视频播放| 久久字幕精品一区| 91精品国产91久久久久久不卡 | 亚洲狼人综合网| 久久国产生活片100| 日韩美女中文字幕| 久久草视频在线| 欧美精品导航| 超碰精品一区二区三区乱码| 亚洲精品一区二区三区影院忠贞| 噜噜噜天天躁狠狠躁夜夜精品| 日韩一区二区三区三四区视频在线观看 | 亚洲成色777777在线观看影院| 亚洲欧洲日本精品| 成人va天堂| 欧美性少妇18aaaa视频| 欧美一级片免费播放| 宅男在线观看免费高清网站 | 国产va在线播放| 99热国内精品永久免费观看| 在线看日韩欧美| 精品无码人妻一区二区免费蜜桃| 午夜先锋成人动漫在线| 日韩av中文字幕在线免费观看| 精品国产aⅴ一区二区三区东京热| 深夜日韩欧美| 欧美日韩免费观看一区二区三区| 免费看a级黄色片| 婷婷激情一区| 在线视频一区二区三| 性欧美极品xxxx欧美一区二区| 色老太综合网| 欧美色欧美亚洲另类二区| 日本美女高潮视频| 久久69成人| 666欧美在线视频| 91性高潮久久久久久久| 日韩视频一二区| 亚洲国产精品一区二区久| 亚洲熟女乱综合一区二区三区| 国产精东传媒成人av电影| 精品视频久久久| 波多野吉衣中文字幕| 免费欧美一区| 日韩视频免费在线| 美女毛片在线观看| 中文亚洲免费| 国产精品美女免费看| 国产精品久久综合青草亚洲AV| 国产又黄又大久久| 国产日本一区二区三区| 黄色av网站在线看| 亚洲男人天堂av网| 可以在线看的av网站| 日日夜夜天天综合| 欧美一级理论性理论a| 亚洲天堂美女视频| 欧美一区二区性| 欧美成人精品三级在线观看 | 国产一级在线| 亚洲视频一区在线| 国产免费黄色av| 九七电影院97理论片久久tvb| 日韩精品一区二区三区四区| 日本丰满少妇裸体自慰| 久久亚洲在线| 午夜精品一区二区三区在线视| 国产成人一级片| 精品在线播放免费| 久久久99国产精品免费| 午夜免费福利在线观看| 亚洲国产成人tv| 亚洲综合色在线观看| av在线亚洲色图| 中文字幕一精品亚洲无线一区| 久久久久久国产精品免费播放| 久久高清免费观看| http;//www.99re视频| 国产毛片在线| 亚洲国产精品一区二区www在线| 国产v亚洲v天堂无码久久久| 97久久亚洲| 宅男66日本亚洲欧美视频| 激情视频在线播放| 蜜桃精品视频在线观看| 好吊色欧美一区二区三区视频 | 国产精品毛片a∨一区二区三区| 欧美激情亚洲天堂| 六九午夜精品视频| 亚洲另类xxxx| 精品无码一区二区三区电影桃花| 蜜臀av一区二区在线免费观看| 国产亚洲精品久久飘花| 成人免费在线| 欧美日韩国产中文| 手机免费看av| 国产精品乱看| 国产精品白丝jk白祙| 黄网址在线观看| 欧美最新大片在线看| 欧美做受喷浆在线观看| 伊人久久亚洲热| 666精品在线| 秋霞午夜理伦电影在线观看| 欧美又粗又大又爽| 日韩一级av毛片| 香蕉久久夜色精品| 精品久久中出| bbw在线视频| 亚洲白拍色综合图区| 国产97免费视频| 精品无人码麻豆乱码1区2区| 亚洲精品中文字幕乱码三区不卡| 欧美成人黑人| 亚洲欧美中文日韩在线| 特黄视频免费看| 91免费看视频| 国产精品视频一区二区三区四区五区| 久久91在线| 97在线视频免费| 少妇喷水在线观看| 五月婷婷另类国产| 精品无码在线视频| 日一区二区三区| 任我爽在线视频精品一| 精品欧美一区二区三区在线观看 | 97超级碰碰人国产在线观看| 天天操天天操天天干| 午夜精品久久久久久| 捆绑裸体绳奴bdsm亚洲| 香蕉久久夜色精品| 天堂一区二区三区| 四虎国产精品免费久久5151| 久久天天躁狠狠躁夜夜爽蜜月 | 超碰国产一区| 一区二区三区视频观看| 亚洲天堂手机版| 亚洲人成7777| 在线免费看黄色片| 久久亚洲不卡| 一本色道久久99精品综合| 自拍偷拍亚洲| 久久99视频精品| 天天爽夜夜爽夜夜爽| 日本精品一区二区三区四区的功能| 真实乱视频国产免费观看 | 日韩av手机在线看| 日本中文字幕视频在线| 欧美xxxxxxxx| 国产精品男女视频| 国产精品美女久久福利网站| 又黄又爽又色的视频| 99国产精品私拍| 日韩av不卡播放| 国产一区 二区| 午夜免费在线观看精品视频| 国产免费av高清在线| 日韩午夜激情免费电影| 特一级黄色大片| 国产精品久久夜| 欧美激情 亚洲| 日本麻豆一区二区三区视频| 国产激情在线看| 香蕉人人精品| 亚洲一区二区三区乱码aⅴ蜜桃女| 黄色在线看片| 在线a欧美视频| 亚洲精品字幕在线| 欧美日韩国产另类不卡| 国产午夜精品无码一区二区| 欧美国产乱子伦| 中国特级黄色大片| 美女脱光内衣内裤视频久久影院| 成人在线国产视频| 93在线视频精品免费观看| 精品一区二区三区国产| 91精品国产色综合久久不卡粉嫩| 91极品女神在线| av网站导航在线观看免费| 亚洲欧美日韩中文在线制服| 精品人妻一区二区三区四区不卡| 日本高清成人免费播放| www.youjizz.com亚洲| 国产精品女主播av| 91视频免费观看网站| 国产成人av一区二区三区在线| 一区二区三区网址| 久久精品人人做人人爽电影蜜月| 粉嫩av一区二区三区天美传媒 | 日韩成人在线网站| 国产草草影院ccyycom| 欧洲一区二区三区在线| 久久亚洲精品国产| 亚洲国产精品尤物yw在线观看| 精品自拍偷拍视频| 国产精品初高中害羞小美女文| 日韩中文字幕电影| 91视频xxxx| 99久久人妻精品免费二区| 懂色av中文字幕一区二区三区| 911福利视频| 麻豆成人综合网| 精品久久久久久中文字幕2017| 午夜一级久久| 岳毛多又紧做起爽| 亚洲伊人网站| 日韩精品xxxx| 亚洲精品看片| 欧美成人三级在线视频| 一区视频在线| 日韩中字在线观看| 999亚洲国产精| 欧美二区在线视频| 国产精品婷婷| 免费在线观看亚洲视频| 一本久道综合久久精品| 久久久999免费视频| 宅男噜噜噜66国产日韩在线观看| 成人性生活视频免费看| 日韩一级在线| 粉嫩虎白女毛片人体| 日本不卡免费在线视频| 国产视频1区2区3区| 久草精品在线观看| 国产一区二区在线观看免费视频| 卡一卡二国产精品| 最新av免费在线观看| 狠狠色狠狠色综合日日91app| 欧美成人福利在线观看| 国产真实乱子伦精品视频| 日韩精品视频网址| 懂色av一区二区在线播放| 特级西西人体4444xxxx| 久久先锋影音av鲁色资源网| 国产一区二区三区四区五区六区| 日本一区二区三区在线不卡| 青青青视频在线免费观看| 成人免费在线视频| 久久久久成人片免费观看蜜芽| 福利一区福利二区微拍刺激| 久久久精品毛片| 4438成人网| 天天射天天操天天干| 最近日韩中文字幕中文| 一区二区三区伦理| 欧美亚洲成人免费| 免费视频成人| 超碰97国产在线| 五月激激激综合网色播| 在线免费观看成人| 99在线精品免费视频九九视| 嫩草av久久伊人妇女超级a| 九色综合狠狠综合久久| 97人妻天天摸天天爽天天| 一区在线观看视频| 中文字幕视频网站| 91精品国产麻豆国产自产在线| 污视频在线免费| 色青青草原桃花久久综合| 成人av福利| 欧美一区深夜视频| 亚洲高清影院| 国产伦精品一区| 精品国产乱码久久久久久果冻传媒 | 日韩成人xxxx| 免费av在线| 欧美亚洲视频一区二区| 九九99久久精品在免费线bt| 欧美激情第六页| 欧美日韩 国产精品| 激情综合网俺也去| av在线一区二区三区| 极品美妇后花庭翘臀娇吟小说| 精品二区三区线观看| av男人天堂网| 中文综合在线观看| 周于希免费高清在线观看| 亚洲综合在线中文字幕| 欧美日韩水蜜桃| 国产精品自拍片| 国产精品一卡二卡在线观看| 黄色三级生活片| 欧美日韩国产激情| 亚洲av无码片一区二区三区| 深夜福利日韩在线看| 亚洲天堂一区二区| 麻豆精品蜜桃一区二区三区| 欧美片第1页综合| 91国内在线播放| 国产欧美一区二区精品仙草咪 | 国产精品v欧美精品v日本精品动漫| 亚洲黄色av网址| 久久久影视传媒| 国产香蕉视频在线| 亚洲国产成人精品久久| 国产蜜臀在线| 亚洲综合自拍一区| 亚洲91久久| 日韩av一卡二卡三卡| 国产精品美女久久久久久久| 中文字幕视频免费观看| 国产亚洲欧美视频| 二吊插入一穴一区二区| 麻豆成人av| 午夜在线视频观看日韩17c| 欧美精品黑人猛交高潮| 五月婷婷久久综合| 天天躁日日躁狠狠躁伊人| 国精产品一区一区三区有限在线| 视频亚洲一区二区| 超薄肉色丝袜足j调教99| 国产一区二区三区四区五区入口 | 亚洲伦在线观看| 国产sm主人调教女m视频| 久久天天躁狠狠躁夜夜爽蜜月| 香蕉成人在线| 成年在线观看视频| 国产成人综合精品三级| 免费日韩在线视频| 亚洲成人av在线| 美女露胸视频在线观看| 欧美日韩精品综合| 日韩电影网1区2区| 成人无码精品1区2区3区免费看| 欧美日韩久久一区| 麻豆网站在线看| 99在线视频播放| 国产精品多人| 中文字幕一区二区久久人妻网站| 欧美日韩一区二区在线| 国产原创av在线| 国产在线观看一区二区三区| 久久久国产精品| 95视频在线观看| 色综合夜色一区| a视频网址在线观看| 91精品中文在线| 亚洲一级网站| av女人的天堂| 日韩一区二区视频在线观看| 成年男女免费视频网站不卡| 欧美另类视频在线| 久久精品久久精品| 亚洲欧美一二三| 麻豆网站在线免费观看| 91精品视频免费| 国内精品亚洲| 中文字幕国产综合| 欧美精品777| av免费不卡| 亚洲精品一区二区三区蜜桃久| 国产一区不卡视频| 欧美另类一区二区| www.国产一区| 精品视频高潮| 美女一区二区三区视频| 亚洲精品成a人| 男人的天堂在线视频| 91久久国产综合久久91精品网站 | 人妻夜夜添夜夜无码av| 国产日韩欧美一区二区三区乱码|