亚洲有码Av一区二区三区_国产高清啪啪免费视频_69色视频国产_国产成人人人爆出白浆_国产精品自在线拍国_一本久久伊人热热精品无码_午夜性刺激在线看免费带字幕_助力高品质欧美狂喷水_亚洲精品日韩无码_精品无码一区二区三区蜜臀_麻豆高清国产AV_熟妇人素无码中文字幕_亚洲a级片在线观看_国产欧美日韩三区_99国产成人高清在线观看

ARTICLE DETAIL

資訊詳情

深耕商務(wù)建站與企業(yè)官網(wǎng)運(yùn)營(yíng)的一線實(shí)戰(zhàn)洞察。

Linux命令行開(kāi)發(fā)工具鏈全解析:GCC、GDB、Make與Git實(shí)戰(zhàn)

Linux命令行開(kāi)發(fā)工具鏈全解析:GCC、GDB、Make與Git實(shí)戰(zhàn) 剛把上一篇的編輯器和終端基礎(chǔ)過(guò)完這篇直接進(jìn)入正題真正寫(xiě)代碼、編代碼、調(diào)代碼時(shí)每天都要碰的那套工具鏈。我見(jiàn)過(guò)太多新手卡在“代碼寫(xiě)好了但不知道下一步干嘛”的狀態(tài)其實(shí)Linux下的開(kāi)發(fā)流程非常固定無(wú)非就是編輯、編譯、調(diào)試、構(gòu)建、版本管理這幾件事每一件都有對(duì)應(yīng)的成熟工具。這篇文章我把它們串成一條線講清楚每個(gè)工具解決什么問(wèn)題、怎么用最順手、以及哪些坑我替你踩過(guò)了。這套內(nèi)容適合剛把Linux基礎(chǔ)命令過(guò)完、準(zhǔn)備正經(jīng)寫(xiě)C/C或Python項(xiàng)目的讀者也適合那些已經(jīng)在用IDE、但對(duì)命令行工具鏈?zhǔn)冀K有種“好像很厲害但不知道怎么上手”感覺(jué)的朋友??赐昴銘?yīng)該能脫離IDE純粹用命令行把一個(gè)多文件項(xiàng)目從源碼變成可執(zhí)行文件并且能調(diào)試、能追蹤版本、能管理依賴。這不僅僅是炫技而是很多生產(chǎn)環(huán)境和遠(yuǎn)程服務(wù)器上的真實(shí)工作方式。1. 內(nèi)容整體設(shè)計(jì)與思路拆解1.1 為什么Linux開(kāi)發(fā)繞不開(kāi)命令行工具鏈先說(shuō)個(gè)很多人問(wèn)過(guò)我的問(wèn)題現(xiàn)在VS Code、CLion、JetBrains這些IDE做得這么成熟圖形界面點(diǎn)來(lái)點(diǎn)去不挺好嗎為什么還要在命令行里折騰gcc、gdb、make這些東西我的回答是圖形IDE本質(zhì)上是包裝了一層殼殼里面跑的還是命令行工具鏈。你在IDE里點(diǎn)一個(gè)“運(yùn)行”按鈕它在背后幫你執(zhí)行了編譯命令、鏈接命令、啟動(dòng)調(diào)試器。也就是說(shuō)IDE是個(gè)翻譯官而命令行工具才是真正干活的工人。哪天這個(gè)翻譯官出了錯(cuò)、傳錯(cuò)了參數(shù)你看不到底層發(fā)生了什么排查起來(lái)就特別被動(dòng)。更現(xiàn)實(shí)的原因是生產(chǎn)環(huán)境——尤其是服務(wù)器——絕大多數(shù)是沒(méi)有圖形界面的。你寫(xiě)一段腳本去服務(wù)器上編譯服務(wù)、部署項(xiàng)目靠的就是命令行。就算你個(gè)人開(kāi)發(fā)喜歡用IDE部署和運(yùn)維環(huán)節(jié)遲早要面對(duì)命令行。與其到那時(shí)候才倉(cāng)促學(xué)不如現(xiàn)在就把底層的這套邏輯打通。再一個(gè)命令行工具的另一個(gè)優(yōu)勢(shì)是可腳本化。任何重復(fù)性的編譯操作都可以寫(xiě)成一個(gè)腳本或Makefile一條命令完成整個(gè)構(gòu)建流程。IDE里每一步都要鼠標(biāo)操作想自動(dòng)化都沒(méi)法下手。1.2 本篇的工具選型邏輯Linux下的開(kāi)發(fā)工具有很多但我不打算做成一個(gè)百科全書(shū)式的清單那除了增加記憶負(fù)擔(dān)沒(méi)什么實(shí)際用處。我的選型標(biāo)準(zhǔn)是高頻、剛需、跨項(xiàng)目通用。編譯器選GCC系列。雖然Clang也很優(yōu)秀但GCC在Linux發(fā)行版里是默認(rèn)安裝、兼容性最好的而且很多底層系統(tǒng)庫(kù)都依賴它。先掌握GCC再去看Clang幾乎沒(méi)有學(xué)習(xí)成本。調(diào)試器選GDB。這沒(méi)什么懸念Linux下的事實(shí)標(biāo)準(zhǔn)就是它。LLDB雖然也不錯(cuò)但GDB的資料、插件、生態(tài)明顯更豐富。構(gòu)建工具先講Make再引出CMake。很多人覺(jué)得Make已經(jīng)被時(shí)代拋棄了其實(shí)遠(yuǎn)遠(yuǎn)沒(méi)有——大量C/C項(xiàng)目仍然用Makefile而且理解Make的依賴關(guān)系邏輯對(duì)你理解CMake生成的構(gòu)建系統(tǒng)有直接幫助。版本控制直接上Git理由不用多解釋它已經(jīng)是這個(gè)行業(yè)的事實(shí)標(biāo)準(zhǔn)了。Python環(huán)境管理選pyenvvenv的組合分別解決Python版本切換和項(xiàng)目依賴隔離的問(wèn)題。這個(gè)放到最后一節(jié)講因?yàn)楝F(xiàn)在的Linux開(kāi)發(fā)早就不只是C/C的天下Python腳本幾乎每個(gè)項(xiàng)目里都有。這套組合選下來(lái)你會(huì)發(fā)現(xiàn)一個(gè)共同點(diǎn)它們?nèi)际亲杂绍浖鷳B(tài)里的老兵穩(wěn)定、靠譜、文檔豐富而且彼此之間的配合非常默契。2. 核心細(xì)節(jié)解析與實(shí)操要點(diǎn)2.1 GCC編譯器的完整工作流程GCC用的次數(shù)最多但大部分人其實(shí)只用過(guò)最簡(jiǎn)單的用法gcc main.c -o main然后回車。這當(dāng)然能出結(jié)果但如果只知道這一條命令你很難理解編譯過(guò)程中遇到的各種報(bào)錯(cuò)也不清楚那些中間產(chǎn)物到底去哪了。GCC把源碼變成可執(zhí)行文件中間經(jīng)歷了四個(gè)階段預(yù)處理、編譯、匯編、鏈接。預(yù)處理階段會(huì)處理#include、#define這些指令把頭文件內(nèi)容展開(kāi)、宏替換掉。編譯階段把預(yù)處理后的C代碼翻譯成匯編語(yǔ)言。匯編階段把匯編代碼轉(zhuǎn)成機(jī)器指令這時(shí)候就生成了我們常說(shuō)的目標(biāo)文件.o文件。鏈接階段把多個(gè)目標(biāo)文件和庫(kù)文件合并解析符號(hào)引用最終生成可執(zhí)行文件。你可以用-E、-S、-c這三個(gè)參數(shù)分別停在這三個(gè)階段看看中間產(chǎn)物長(zhǎng)什么樣。我建議每個(gè)新手都跑一遍這個(gè)過(guò)程哪怕只看一次你就能直觀理解那些.o文件和可執(zhí)行文件的關(guān)系了。實(shí)操時(shí)有個(gè)參數(shù)我建議養(yǎng)成習(xí)慣加-Wall意思是開(kāi)啟所有常見(jiàn)的警告信息。再加一個(gè)-Wextra會(huì)更嚴(yán)格。很多問(wèn)題在編譯階段就暴露出來(lái)比運(yùn)行時(shí)崩潰好查得多。gcc -Wall -Wextra main.c -o main還有個(gè)常見(jiàn)的坑編譯和鏈接要分清。當(dāng)你使用第三方庫(kù)的時(shí)候頭文件路徑要用-I指定鏈接庫(kù)用-l指定庫(kù)所在路徑用-L指定。比如用到了pthread庫(kù)gcc main.c -I./include -L./lib -lmylib -lpthread -o main新手常犯的錯(cuò)誤是只寫(xiě)了頭文件路徑就以為庫(kù)也鏈接上了結(jié)果編譯通過(guò)鏈接階段報(bào)一堆undefined reference。記住頭文件告訴編譯器“有這個(gè)函數(shù)”鏈接器負(fù)責(zé)“找到這個(gè)函數(shù)的具體實(shí)現(xiàn)”。2.2 鏈接靜態(tài)庫(kù)與動(dòng)態(tài)庫(kù)的正確姿勢(shì)說(shuō)到鏈接就得多說(shuō)兩句靜態(tài)庫(kù)和動(dòng)態(tài)庫(kù)的區(qū)別。這個(gè)知識(shí)點(diǎn)幾乎每個(gè)項(xiàng)目都會(huì)碰到而且很多老手都容易混淆。靜態(tài)庫(kù)實(shí)質(zhì)上是把一堆目標(biāo)文件打包成一個(gè).a文件鏈接的時(shí)候直接把這個(gè)庫(kù)里的代碼復(fù)制到可執(zhí)行文件里。優(yōu)點(diǎn)是部署簡(jiǎn)單拷走一個(gè)可執(zhí)行文件就能跑缺點(diǎn)是文件體積大而且如果庫(kù)有更新你得重新編譯整個(gè)程序。動(dòng)態(tài)庫(kù)是.so文件鏈接的時(shí)候只記錄依賴關(guān)系運(yùn)行時(shí)才去加載。優(yōu)點(diǎn)是可以共享內(nèi)存空間、更新庫(kù)無(wú)需重新編譯程序缺點(diǎn)是可執(zhí)行文件對(duì)環(huán)境有依賴——目標(biāo)機(jī)器上必須存在對(duì)應(yīng)版本的動(dòng)態(tài)庫(kù)否則就會(huì)報(bào)cannot open shared object file這類錯(cuò)誤。我曾見(jiàn)過(guò)一個(gè)項(xiàng)目為了圖省事把所有依賴都靜態(tài)鏈接進(jìn)了可執(zhí)行文件結(jié)果一個(gè)不到10MB的源碼工程編譯出來(lái)的二進(jìn)制有200多MB。相反的例子是有人把自己寫(xiě)的程序拖到另一臺(tái)服務(wù)器上動(dòng)態(tài)庫(kù)版本對(duì)不上程序直接起不來(lái)。這兩種情況都挺糟心的。我的建議是系統(tǒng)庫(kù)優(yōu)先用動(dòng)態(tài)鏈接方便和安全更新自己發(fā)布給別人的程序優(yōu)先靜態(tài)鏈接省得依賴地獄。3. 實(shí)操過(guò)程與核心環(huán)節(jié)實(shí)現(xiàn)3.1 從零搭建一個(gè)多文件C項(xiàng)目理論講了這么多我們現(xiàn)在實(shí)際操作一遍完整地走一個(gè)多文件C項(xiàng)目從源碼到構(gòu)建的流程。假設(shè)我們要實(shí)現(xiàn)一個(gè)簡(jiǎn)單的計(jì)算器支持加法和乘法分三個(gè)文件main.c負(fù)責(zé)交互邏輯add.c和mul.c分別實(shí)現(xiàn)兩個(gè)運(yùn)算函數(shù)頭文件放在include/calculator.h。目錄結(jié)構(gòu)長(zhǎng)這樣calc/ ├── include/ │ └── calculator.h ├── src/ │ ├── main.c │ ├── add.c │ └── mul.c └── Makefile頭文件里聲明兩個(gè)函數(shù)#ifndef CALCULATOR_H #define CALCULATOR_H int add(int a, int b); int mul(int a, int b); #endif我說(shuō)的這個(gè)頭文件保護(hù)宏值得解釋一下#ifndef、#define、#endif這三行是防止頭文件被重復(fù)包含的經(jīng)典寫(xiě)法。當(dāng)多個(gè)源文件同時(shí)包含同一個(gè)頭文件時(shí)沒(méi)有這個(gè)保護(hù)會(huì)導(dǎo)致重復(fù)聲明編譯直接報(bào)錯(cuò)?,F(xiàn)在很多編譯器支持#pragma once來(lái)替代寫(xiě)法更簡(jiǎn)潔但老項(xiàng)目里還是宏保護(hù)的寫(xiě)法更常見(jiàn)。add.c的內(nèi)容就不用多說(shuō)了就是一個(gè)簡(jiǎn)單的加法函數(shù)。重點(diǎn)看Makefile怎么寫(xiě)CC gcc CFLAGS -Wall -Wextra -Iinclude OBJS src/main.o src/add.o src/mul.o TARGET calc $(TARGET): $(OBJS) $(CC) $(OBJS) -o $(TARGET) src/%.o: src/%.c $(CC) $(CFLAGS) -c $ -o $ clean: rm -f $(OBJS) $(TARGET)Makefile的語(yǔ)法初看有點(diǎn)嚇人但它背后的邏輯其實(shí)很直白目標(biāo)依賴于前置條件前置條件比目標(biāo)新時(shí)才執(zhí)行命令。上面這段里$(TARGET)依賴三個(gè).o文件每個(gè).o文件依賴對(duì)應(yīng)的.c文件。你只改了add.cMake會(huì)檢測(cè)到只有add.o過(guò)期了于是只重新編譯add.o再鏈接其他文件原封不動(dòng)。這個(gè)增量編譯能力在大型項(xiàng)目里能省下大量重復(fù)編譯的時(shí)間。運(yùn)行make就能得到calc可執(zhí)行文件運(yùn)行make clean清理構(gòu)建產(chǎn)物。接下來(lái)的調(diào)試環(huán)節(jié)我就拿這個(gè)項(xiàng)目當(dāng)例子。3.2 GDB調(diào)試入門斷點(diǎn)、單步、變量查看很多新手調(diào)試代碼的方式是“print大法”——在關(guān)鍵位置加一堆printf跑一遍看輸出然后刪掉再跑一遍。小項(xiàng)目還好邏輯復(fù)雜了之后你會(huì)發(fā)現(xiàn)這招效率極低加printf要重新編譯重新部署而且printf本身可能改變程序的時(shí)序行為。GDB就不一樣了它直接附著在程序上隨時(shí)暫停、隨時(shí)查看內(nèi)存里的值不需要改源碼。調(diào)試的第一步是用-g參數(shù)編譯讓生成的可執(zhí)行文件帶上調(diào)試信息gcc -g -Wall -Wextra src/main.c src/add.c src/mul.c -Iinclude -o calc然后啟動(dòng)調(diào)試gdb ./calc進(jìn)去之后先break main在main函數(shù)入口打斷點(diǎn)然后run開(kāi)始運(yùn)行。程序停在斷點(diǎn)處后next是逐行執(zhí)行且不進(jìn)入函數(shù)內(nèi)部step是進(jìn)入函數(shù)內(nèi)部單步跟蹤。print add_result可以直接查看變量的值backtrace簡(jiǎn)寫(xiě)bt可以在程序崩潰時(shí)查看調(diào)用棧。我最常用的是watch命令它能監(jiān)視一個(gè)變量一旦這個(gè)變量的值發(fā)生變化就暫停程序。比如你懷疑某個(gè)全局變量被不該修改的地方改了給它設(shè)個(gè)watchpointGDB會(huì)在值發(fā)生變化的第一時(shí)間停下來(lái)直接定位到修改它的那行代碼。這個(gè)功能用printf大法幾乎沒(méi)法實(shí)現(xiàn)但用GDB幾秒鐘就能查清楚。程序崩潰時(shí)也別慌。段錯(cuò)誤Segmentation Fault是大家見(jiàn)得最多的崩潰類型先把bt命令輸進(jìn)去查看崩潰時(shí)的調(diào)用?;揪湍苕i定是哪個(gè)函數(shù)的問(wèn)題再跳到對(duì)應(yīng)幀查看具體變量的值。這條排查路徑我已經(jīng)走過(guò)無(wú)數(shù)次熟練之后平均三次bt就能定位一個(gè)崩潰點(diǎn)。3.3 用core dump文件事后復(fù)盤崩潰現(xiàn)場(chǎng)這里必須提一個(gè)很實(shí)用但容易被忽略的功能——core dump。當(dāng)程序崩潰時(shí)操作系統(tǒng)會(huì)把進(jìn)程退出時(shí)的內(nèi)存快照保存下來(lái)這個(gè)文件就叫core dump。之后你可以用GDB加載它還原崩潰現(xiàn)場(chǎng)的調(diào)用棧和變量值。很多Linux發(fā)行版默認(rèn)關(guān)閉了core dump先用命令開(kāi)啟ulimit -c unlimited這條命令只對(duì)當(dāng)前shell會(huì)話有效想讓永久生效可以寫(xiě)進(jìn)~/.bashrc。程序崩潰后工作目錄下會(huì)出現(xiàn)一個(gè)core或core.數(shù)字的文件然后用GDB加載gdb ./calc core直接回車執(zhí)行bt你就能看到和運(yùn)行時(shí)調(diào)試一模一樣的調(diào)用棧。這種玩法在線上事故排查里特別重要——你可以在服務(wù)器上讓崩潰現(xiàn)場(chǎng)留下證據(jù)事后再慢慢分析而不是干瞪眼。有個(gè)小細(xì)節(jié)默認(rèn)的core文件內(nèi)核轉(zhuǎn)儲(chǔ)可能被/proc/sys/kernel/core_pattern重定向到了系統(tǒng)日志服務(wù)比如systemd-coredump這時(shí)候你跑到當(dāng)前目錄下找不到core文件可以去看系統(tǒng)日志或者把core_pattern改回文件方式。我在生產(chǎn)環(huán)境遇到過(guò)兩次這個(gè)情況都是查了core_pattern才找到文件在哪。3.4 用CMake接管構(gòu)建配置Makefile在小項(xiàng)目里很好用但一旦項(xiàng)目大起來(lái)、依賴多起來(lái)、需要跨平臺(tái)編譯手寫(xiě)Makefile就會(huì)變得非常痛苦。這時(shí)候就該CMake登場(chǎng)了。CMake本身不做編譯它負(fù)責(zé)生成Makefile或者其他構(gòu)建系統(tǒng)的文件。也就是說(shuō)你面對(duì)CMake寫(xiě)規(guī)則CMake幫你生成Makefile然后再由Make去真正編譯。這多出來(lái)的一層抽象換來(lái)的是跨平臺(tái)能力和更強(qiáng)大的依賴查找功能。同樣那個(gè)計(jì)算器項(xiàng)目用CMake寫(xiě)的CMakeLists.txt長(zhǎng)這樣cmake_minimum_required(VERSION 3.10) project(calc C) set(CMAKE_C_STANDARD 11) add_executable(calc src/main.c src/add.c src/mul.c ) target_include_directories(calc PRIVATE include)然后執(zhí)行mkdir build cd build cmake .. make標(biāo)準(zhǔn)流程是創(chuàng)建一個(gè)獨(dú)立的build目錄在里面運(yùn)行cmake ..這樣所有中間文件都會(huì)留在build目錄里源碼目錄保持干凈。我現(xiàn)在即使寫(xiě)很小的項(xiàng)目也習(xí)慣用這個(gè)流程因?yàn)楹竺嬉拥谌綆?kù)的時(shí)候CMake的find_package命令比手動(dòng)去翻庫(kù)的路徑靠譜得多。第一次跑CMake的時(shí)候大家最喜歡問(wèn)的一個(gè)問(wèn)題是為什么要多一個(gè)build目錄直接cmake .行不行答案是可以但你的源代碼目錄會(huì)被一堆CMake生成的臨時(shí)文件污染。用獨(dú)立的build目錄刪除構(gòu)建產(chǎn)物時(shí)一個(gè)rm -rf build就完事源碼始終清爽。3.5 Git配合代碼搜索的日常循環(huán)寫(xiě)代碼這件事百分之八十的時(shí)間其實(shí)不是在打字而是在讀代碼——讀自己的舊代碼、讀同事的代碼、讀開(kāi)源項(xiàng)目的代碼。所以除了版本管理代碼搜索工具也是開(kāi)發(fā)者的基本裝備。Git的日常操作我用得最多的大概就是五個(gè)git add、git commit、git push、git pull、git log。但如果只說(shuō)基礎(chǔ)操作這篇的價(jià)值就太淺了。我想強(qiáng)調(diào)幾個(gè)實(shí)戰(zhàn)中特別有用的習(xí)慣。第一個(gè)是小步提交。每完成一個(gè)可持續(xù)構(gòu)建的小功能就提交一次而不是憋一個(gè)大提交。好處是出問(wèn)題時(shí)可以精確定位是哪次提交引入的配合git bisect能自動(dòng)二分查找出問(wèn)題的提交。第二個(gè)是多用分支。任何一個(gè)有點(diǎn)探索性質(zhì)的功能改動(dòng)我都會(huì)從主分支切一個(gè)feature分支出來(lái)改到一半發(fā)現(xiàn)思路不對(duì)直接放棄這個(gè)分支完全不污染主分支。git checkout -b feature/calc-mul # 各種修改 git add . git commit -m feat: implement multiplication git checkout master第三個(gè)是善用git diff。每次提交之前我會(huì)習(xí)慣性地跑一遍git diff逐個(gè)文件看這次到底改了什么。這個(gè)習(xí)慣幫我攔下了無(wú)數(shù)次誤改和臨時(shí)調(diào)試代碼混入提交的情況。代碼搜索方面Linux自帶的grep雖然能用但遞歸搜索一堆文件時(shí)效率一般。我現(xiàn)在的標(biāo)配是ripgreprg速度比grep快一個(gè)量級(jí)而且默認(rèn)尊重.gitignore——也就是不會(huì)去搜版本庫(kù)忽略掉的文件。用法幾乎無(wú)腦rg unsigned long --type c src/搜出來(lái)直接帶文件名和行號(hào)點(diǎn)個(gè)回車就能去編輯器跳到對(duì)應(yīng)位置。我周圍很多老工程師已經(jīng)離不開(kāi)這個(gè)工具了屬于一眼入坑型軟件。3.6 Python環(huán)境的干凈管理方案最后這塊是個(gè)很多人踩坑的重災(zāi)區(qū)——Python環(huán)境管理。我曾經(jīng)見(jiàn)過(guò)一臺(tái)開(kāi)發(fā)服務(wù)器Python版本3.5到3.12共存pip install往系統(tǒng)目錄里亂塞了一堆包再裝新包時(shí)不斷冒出版本沖突的報(bào)錯(cuò)最后沒(méi)人敢動(dòng)那臺(tái)機(jī)器。Linux各發(fā)行版預(yù)裝的Python版本普遍偏保守而且系統(tǒng)組件依賴特定Python版本你絕對(duì)不能直接去動(dòng)系統(tǒng)的Python。正確的方案是用pyenv自由切換版本用venv為每個(gè)項(xiàng)目做依賴隔離。pyenv的安裝方式在不同系統(tǒng)上略有區(qū)別核心邏輯是把Python安裝到用戶目錄里并通過(guò)PATH攔截機(jī)制讓python命令指向你指定的版本。裝好之后的日常操作非常舒服pyenv install 3.11.8 pyenv global 3.11.8pyenv global設(shè)置的是整個(gè)用戶環(huán)境默認(rèn)的Python版本。如果某個(gè)項(xiàng)目需要其他版本在該項(xiàng)目目錄里執(zhí)行pyenv local 3.10.0它會(huì)生成一個(gè)隱藏的.python-version文件進(jìn)入這個(gè)目錄時(shí)自動(dòng)切換版本。版本確定下來(lái)之后每個(gè)項(xiàng)目創(chuàng)建獨(dú)立的虛擬環(huán)境cd myproject python -m venv .venv source .venv/bin/activate pip install flask requests激活之后pip install裝的所有包都只存在于.venv這個(gè)目錄里刪掉這個(gè)目錄就等于環(huán)境完全清除系統(tǒng)Python不受任何影響。這比用conda創(chuàng)建重環(huán)境要來(lái)得輕量許多日常Python開(kāi)發(fā)完全夠用。有個(gè)用過(guò)都說(shuō)好的習(xí)慣是把.venv寫(xiě)進(jìn).gitignore虛擬環(huán)境目錄絕不提交到Git倉(cāng)庫(kù)。別人克隆你的項(xiàng)目后自己執(zhí)行python -m venv .venv重建環(huán)境再配合requirements.txt或pyproject.toml安裝依賴。整個(gè)流程幾分鐘就能復(fù)現(xiàn)。4. 常見(jiàn)問(wèn)題與排查技巧實(shí)錄4.1 編譯階段高頻報(bào)錯(cuò)速查表這里整理幾個(gè)我見(jiàn)過(guò)最多、新手最容易卡住的編譯報(bào)錯(cuò)挨個(gè)說(shuō)清楚解決方案。**undefined reference to xxx**這個(gè)報(bào)錯(cuò)出現(xiàn)時(shí)先別慌。它的意思是編譯器找到了函數(shù)的聲明頭文件沒(méi)毛病但鏈接器找不到實(shí)現(xiàn)。排查路線是先看是不是函數(shù)只聲明沒(méi)定義然后看對(duì)應(yīng)源文件有沒(méi)有參與編譯最后看動(dòng)態(tài)庫(kù)有沒(méi)有鏈接。99%的情況出在最后一步——忘了加-l參數(shù)。fatal error: xxx.h: No such file or directory找不頭文件。確認(rèn)頭文件是否真的存在于你指定的路徑然后檢查-I參數(shù)寫(xiě)沒(méi)寫(xiě)對(duì)。我之前在項(xiàng)目里遇到過(guò)一次原因是Makefile里的相對(duì)路徑寫(xiě)錯(cuò)了清理重編譯之后卻怎么都找不到原因最后發(fā)現(xiàn)是緩存make clean后重新make解決。multiple definition of xxx重復(fù)定義。幾乎都是全局變量在頭文件里定義了但沒(méi)有用extern聲明導(dǎo)致的。規(guī)則很簡(jiǎn)單頭文件里只寫(xiě)extern int x;在某個(gè)源文件里寫(xiě)int x 0;。這些報(bào)錯(cuò)的共同點(diǎn)是報(bào)錯(cuò)信息都已經(jīng)指出問(wèn)題所在了關(guān)鍵是你得知道它在哪個(gè)階段發(fā)生的然后對(duì)癥下藥。把GCC的四個(gè)階段搞懂看報(bào)錯(cuò)的心態(tài)會(huì)穩(wěn)很多。4.2 運(yùn)行時(shí)崩潰與GDB配合實(shí)戰(zhàn)讓我舉一個(gè)非常典型的例子。有次我寫(xiě)的程序一運(yùn)行就段錯(cuò)誤沒(méi)有任何提示。我用gdb加載程序后執(zhí)行run程序崩潰在strcpy那一行backtrace看到調(diào)用鏈?zhǔn)菑膍ain調(diào)用parse_line再調(diào)用strcpy。往上跳幾幀打印指針變量的值發(fā)現(xiàn)一個(gè)char指針指向NULL——原因是從配置文件里讀字段時(shí)沒(méi)有判空就直接拷貝了。這類問(wèn)題在GDB面前幾乎無(wú)所遁形。我的建議是給~/.gdbinit加幾行配置讓調(diào)試時(shí)輸出的信息更可讀set print pretty on set pagination off前者讓結(jié)構(gòu)體打印格式更美觀后者關(guān)掉分頁(yè)提示免得每次輸出一屏就卡住。這些小配置雖然不起眼但用起來(lái)順手的程度直接影響調(diào)試體驗(yàn)。另外一個(gè)現(xiàn)象是程序偶爾崩潰、偶爾不崩潰——這類“玄學(xué)問(wèn)題”大概率跟內(nèi)存越界或者未初始化的變量有關(guān)。你在GDB里可能也看不出個(gè)所以然這時(shí)候可以用AddressSanitizer來(lái)幫忙。編譯時(shí)加上-fsanitizeaddress參數(shù)它會(huì)在運(yùn)行時(shí)幫你檢測(cè)越界訪問(wèn)、釋放后使用等內(nèi)存錯(cuò)誤直接打印出具體的出錯(cuò)源碼行。這個(gè)工具我剛接觸時(shí)簡(jiǎn)直覺(jué)得它像魔法——之前要廢半天勁排查的內(nèi)存問(wèn)題它跑一遍就直擊要害。4.3 動(dòng)態(tài)庫(kù)缺失問(wèn)題的排查路徑我猜很多人部署程序到新服務(wù)器時(shí)遇到過(guò)這種報(bào)錯(cuò)error while loading shared libraries: libxxx.so.1: cannot open shared object file: No such file or directory這是典型的動(dòng)態(tài)庫(kù)缺失。先別急著重裝一遍按步驟排查確認(rèn)動(dòng)態(tài)庫(kù)是否存在于系統(tǒng)中find / -name libxxx.so*。不存在說(shuō)明這個(gè)庫(kù)沒(méi)裝對(duì)應(yīng)安裝軟件包存在但找不到檢查/etc/ld.so.conf.d/里的搜索路徑配置。添加路徑后執(zhí)行l(wèi)dconfig刷新緩存。還有一個(gè)環(huán)境變量方式生效的export LD_LIBRARY_PATH/自定義路徑:$LD_LIBRARY_PATH適合臨時(shí)調(diào)試不建議作為常規(guī)部署方式。在講解命令之前先說(shuō)一個(gè)思路差異ldconfig是修改系統(tǒng)級(jí)搜索數(shù)據(jù)庫(kù)對(duì)所有程序生效LD_LIBRARY_PATH只影響當(dāng)前shell和其啟動(dòng)的程序。前者適合正式部署后者適合臨時(shí)開(kāi)發(fā)驗(yàn)證。我自己遇到過(guò)最折騰的一次是動(dòng)態(tài)庫(kù)名字帶版本號(hào)系統(tǒng)里裝了新版但程序需要舊版接口導(dǎo)致加載失敗??磍dd輸出才發(fā)現(xiàn)程序依賴的符號(hào)在新版庫(kù)里被刪掉了。最終的解法是把舊版庫(kù)一起裝上讓鏈接器能同時(shí)找到兩種版本。查這種問(wèn)題要習(xí)慣用ldd命令直接看可執(zhí)行文件依賴了哪些庫(kù)、能否逐一解析。4.4 Make和CMake的緩存陷阱Make的坑主要出在依賴關(guān)系沒(méi)寫(xiě)全。如果你的頭文件變了但Makefile里沒(méi)有把頭文件寫(xiě)進(jìn)依賴列表那Make就不知道要重新編譯源文件結(jié)果就是代碼怎么改都不生效玄學(xué)得像緩存。解決方案有兩個(gè)要么手動(dòng)把頭文件加進(jìn)依賴比如給每個(gè)目標(biāo)文件加對(duì)應(yīng)的頭文件依賴后綴要么用gcc -MM自動(dòng)生成依賴關(guān)系。后者更省心跑一次就能生成一整套依賴規(guī)則。因?yàn)槊看尉幾g時(shí)都重新生成依賴不會(huì)增加太多成本而且能保證依賴絕對(duì)最新我基本上都推薦用這種方法。CMake的坑則是目錄緩存。你改了CMakeLists.txt但忘了重新跑cmake還會(huì)拿舊的配置在構(gòu)建——因?yàn)镃Make把配置結(jié)果緩存在了build目錄的CMakeCache.txt里。所以改了構(gòu)建配置之后必須重新執(zhí)行cmake ..讓它重新讀取配置。如果改了大量配置還是覺(jué)得行為怪怪的直接把build目錄刪了重建一了百了。另外如果項(xiàng)目同時(shí)存在Makefile和CMakeLists文件被多次切換構(gòu)建方式后舊的目標(biāo)文件可能會(huì)和新參數(shù)沖突。務(wù)必要在切換前執(zhí)行對(duì)應(yīng)的clean操作。這類“清理才能解決”的問(wèn)題本質(zhì)上都是構(gòu)建產(chǎn)物和配置狀態(tài)不一致理解了這一層排查就快得多。4.5 Python環(huán)境的幾個(gè)經(jīng)典翻車現(xiàn)場(chǎng)說(shuō)到Python虛擬環(huán)境最常見(jiàn)的翻車就是在虛擬環(huán)境里執(zhí)行了系統(tǒng)Python路徑下的腳本。有時(shí)候你用IDE或者系統(tǒng)服務(wù)跑代碼它直接調(diào)用了/usr/bin/python3而不是你虛擬環(huán)境里的解釋器導(dǎo)致裝好的包全都“不生效”。排查方法很簡(jiǎn)單which python python -c import sys; print(sys.prefix)第一行看解釋器路徑第二行看實(shí)際的site-packages位置。如果指向的不是虛擬環(huán)境路徑說(shuō)明你壓根沒(méi)激活環(huán)境或者某處硬編碼了系統(tǒng)Python路徑。第二個(gè)翻車現(xiàn)場(chǎng)是pip版本和Python版本不匹配。系統(tǒng)里同時(shí)有Python 3.8和3.11時(shí)直接敲pip可能指向的是舊版本的解釋器。解決辦法是用python -m pip來(lái)執(zhí)行這樣就保證pip跟著當(dāng)前python走。第三個(gè)是register that虛擬環(huán)境目錄被移動(dòng)了位置。venv創(chuàng)建后如果移動(dòng)目錄路徑配置就失效了激活時(shí)會(huì)報(bào)錯(cuò)也沒(méi)提示但裝的包怎么都找不到。解決方式就是直接刪掉舊的.venv在新位置重新創(chuàng)建。因?yàn)樘摂M環(huán)境本質(zhì)上就是個(gè)目錄結(jié)構(gòu)重建成本極低不需要有任何心理負(fù)擔(dān)。5. 幾個(gè)我建議你立刻養(yǎng)成的習(xí)慣5.1 把常用配置固化到配置文件里命令行工具用久了你就發(fā)現(xiàn)有些參數(shù)是每次都要敲的——它們不適合每次都手動(dòng)輸入而應(yīng)該固化成配置。GCC的警告參數(shù)、GDB的顯示設(shè)置、Git的用戶信息這類東西都值得一次性配置好。我自己的~/.bashrc里常年存著這幾行alias gccgcc -Wall -Wextra alias lsls --colorauto export EDITORvim還有Git的全局配置git config --global user.name Your Name git config --global user.email youremail.com git config --global core.editor vim很多人一開(kāi)始不重視這些配置每次換新機(jī)器都要重新適應(yīng)一遍白白浪費(fèi)時(shí)間。把這些配置文件備份在云端或者Git倉(cāng)庫(kù)里新機(jī)器克隆一下就能獲得完全一致的開(kāi)發(fā)體驗(yàn)。5.2 學(xué)會(huì)讀文檔而不是只搜答案搜答案確實(shí)能快速解決問(wèn)題但有個(gè)副作用是碎片化的知識(shí)永遠(yuǎn)連不成體系。我發(fā)現(xiàn)很多優(yōu)秀工程師的一個(gè)共同習(xí)慣是遇到一個(gè)工具出了問(wèn)題首先去看官方的文檔——man手冊(cè)、info文檔、項(xiàng)目的官網(wǎng)文檔而不是立刻去搜索引擎里翻別人的二手經(jīng)驗(yàn)。比如gcc的每個(gè)編譯參數(shù)man手冊(cè)里都有精確的說(shuō)明和示例。gdb的每個(gè)命令官方手冊(cè)里也有詳細(xì)的參數(shù)解釋。花點(diǎn)時(shí)間通讀一遍核心文檔比刷20篇零散博客有用得多。我說(shuō)句可能不太好聽(tīng)但很真實(shí)的話你在搜索引擎里找到的絕大多數(shù)報(bào)錯(cuò)解決方案都來(lái)自那些同樣在搜索引擎里找答案的人。很多答案本身是錯(cuò)的或者只適用于特例。真正能定位問(wèn)題本質(zhì)的還是文檔和源碼。不是說(shuō)不能搜而是先自己查一遍再帶著思考去搜效率反而更高。寫(xiě)在最后如果你完整跟著操作到這里編譯、調(diào)試、構(gòu)建、版本管理、環(huán)境隔離這條線已經(jīng)基本打通了。你可以在命令行里獨(dú)立完成一個(gè)小項(xiàng)目的全生命周期再遇到問(wèn)題時(shí)也知道該往哪個(gè)方向排查。我個(gè)人在實(shí)際操作中的體會(huì)是這一整套工具鏈最大的學(xué)習(xí)門檻不在于“記命令”——命令忘了查手冊(cè)就行而在于建立對(duì)軟件構(gòu)建過(guò)程本身的心智模型。當(dāng)你腦子里有了一張清晰的圖源碼經(jīng)過(guò)預(yù)處理、編譯、匯編、鏈接變成可執(zhí)行文件調(diào)試器通過(guò)調(diào)試信息把機(jī)器指令和源碼行對(duì)應(yīng)起來(lái)構(gòu)建工具跟蹤依賴關(guān)系決定什么需要重新生成——所有工具的用法就都在情理之中不用死記硬背。最后再分享一個(gè)小技巧每次花十分鐘寫(xiě)一段“環(huán)境配置筆記”放到自己看得見(jiàn)的地方我放在一個(gè)專門的Git倉(cāng)庫(kù)里記錄下裝了什么工具、為什么裝、怎么配置的。三個(gè)月后你換新電腦或者幫同事排障時(shí)會(huì)發(fā)現(xiàn)這份筆記比你存過(guò)的任何教程都有用。這是我自己堅(jiān)持了五年、回報(bào)率最高的一個(gè)開(kāi)發(fā)習(xí)慣。
返回列表
PREV
查看更多資訊
NEXT
返回資訊列表
日日日啊啊啊| 丰满人妻一区二区三区大胸懂色| 性生活无遮挡纯毛片在线看| 麻豆天美国美国产| 久久久久亚洲?V片无码V| 欧美亚洲综合高清在线| 97爱爱官网| 欧美日韩免费专区在线| 亚洲精品一区中文字幕乱码| 欧美人妻一区| 中文字幕亚洲永久精品| 日本一区不卡| 99999精品| 蜜臀久久99精品久久久久久成人小说| 欧美性综合| 色婷婷aV一区二区三区麻豆综合| 日本黄 R色 成 人网站| 欧洲一级性爱视频在线观看| 国产日逼视频| 国产三级多多影院2022国产AA一级毛片无码 | AV污污污污| 秋霞怕怕片| 蜜臀va69| 91影库| 午夜经典| 日本成人在线不卡一区二区三区| 大香蕉一区二区在线观看.| 91亚洲综合在线| 欧美 牲| 99re8超碰| 欧美五区| 欧美色图 人妻| 玖玖爱综合| 天堂九九九九九九九九九| 五月综合色| 大香蕉久操| 色网在线视频观看免费| 国产最新小视频在线播放下载| av网站免费看| 欧美超碰97| 欧洲人妻视频| 亚洲欧美第一页| 国产强奸乱伦第1页| 91狠狠综合久久| 一区二区三区男人的天堂| 亚洲欧美91√| 亚洲综合91| 日韩综合无码一区久久92| 成年无码动漫av片无尽在线| 日本操逼视频在线| 久久久久久一日韩字幕无码| 激情综合久久| 美女露胸露屁股| 啊灬啊灬啊灬好深灬快高潮了动漫-国产字幕国产在线观看-B049AV | 久久婷婷亚洲| 婷婷五月影院| 超碰 另类 欧美 | 日本天天人人狠狠在线日美女| 日韩精品三区四区| 亚洲s色图| 美女天天干| 蜜臀99久久国产| 97干在线| 操操逼操操逼操操逼逼| 蜜乳av首页| 欧美制服网站美腿丝袜| av天天在线| 9美女超碰在线免费观看| 高清无码人妻久久久一区二区三区aⅴ| 欧美国产精品久久九九| 免费在线黄片视频| 欧美少妇大量自拍视频在线观看| 超碰97久久国| 久久超碰97| 日韩无码操逼片| 欧美国产日韩清纯唯美| 色娱乐色呦呦夜夜夜夜av| 欧美性性性| 强奸乱伦AV网址| 日韩欧美经典在线观看| 青青草华人在线欧美在线| 国产精品诱惑| 高跟丝袜AV专区国产| 99热99re超碰精品| 狠狠爱AV| 色综合V| 亚洲激情网| 智利AV在线网| 亚洲无码太久| 97国产精品国| 日日躁夜夜躁狠狠躁超爽| 日本羞羞的视频在线播放| 粉嫩av在线一区二区| 天天看综合网| 91精品久久久久久| 中文字幕国产| www鬼畜国产男人的天堂| 丝袜翘臀后入欧美校园亚洲自拍另类小说一区中文字幕少妇诱惑 | 国产精品久久久亚洲一区| 秋霞鲁丝午夜无码一区二区三| 国产精品久久泡妞网站| 亚洲成a人在线观看久| 午夜精品99久久久久传媒| 亚洲清纯唯美| 玖玖爱免费观看视频| 美骚妇av高清在线| 国产综合在线视频网站| 中文字幕制服欧美久久一区| 欧美日本成人一区二区| 超碰超碰欧美| 国产精品自拍视频 | 国产精品96| 日本午夜精品理论片A级APP发布| 午夜精品久久久久久久| 国产精品免费日韩| 丝袜无码a片| 久久超碰97| 五月天成人综合| 啊啊啊在线看| 东京热激情视频一二三区| 精品一区二区三区18| 乱伦系列一区二区| 久久成人东京热人妻| 国产高清在线观看欧美| 久草线上视频免费看| 国产精品麻豆视频网站| 久久久专区| 秋霞成人一级在线观看| 久久原创中文| 福利在线黄片| 91欧美经典| 99操| 色欲Av人妻精品一区二| 久久久久9999精品九九九| 一区二区三区高清天码| 婷婷15月天青娱乐| 婷婷丁香成人| 高清视频一区| 欧美天堂日韩三级国产传媒| 日韩丝袜二区| 极品综合| 91日韩网站| 日本熟妇一区二区三区| 亚洲人成网站7777| 久热久操| 欧美精品四区| 日韩精品亚洲专区在线影视| 91老司机视频| 欧美亚洲天堂| 丝袜美女诱惑 91 视频| 激情五月天色播| 97超碰久久| 加勒比综合九九99视频在线播放| 亚欧性爱ab| sewuyueav| 97网址www| 激情五月天插| 欧美综合色图片| 国产又黄又猛又粗又爽的网站| 黄色av网站在线播放| 婷婷九月国产| 91美女在线看| 99热这里是精品| 九九九精品成人免费视频小说| 亚洲高清在线se| 五月丁香色综合| 国产高清视频无码在线| 久操视频这里只有精品| SS久久| 日韩无码专区| 亚洲国产精品9999在线观看| 91五十路| 久久青娱乐| 午夜精品久久久99| 精品久久視頻在线| 亚洲18禁| 黄网在线播放| 福利伊人玖玖国产| 国产精品白丝在线播放 | 97人人模人人爽人人| 国产欧美日本亚洲精品| 一级AAA片一区二区三区| 婷婷五月天久久精品视频一区二区三区| 中文精品一区二去| 大香蕉免费3| 一二三区精品视频| 2019男人的天堂| 亚洲老司机123专区| 综合色图,成人综合网| 综合操逼| 五月婷婷色| 亚洲色诱惑| 国产综合网站在线播放 | 翔田千里AV无码秘 三区| 一级黄碟| 亚洲另类色综合网站| 91色综合激情| 人妻天天操天天爽视频免费| 色妹子A V| 啊灬啊灬啊灬好深灬快高潮了动漫-国产字幕国产在线观看-B049AV | 久草福利在线资源站| 天天躁日日躁成人字幕aⅴ| 国内伊人久久久久久网站视频| 久久久久久久久女黄| 青草视频人妻在线观看| 逼操网站| 手机看av网站在线看| 无码国产Av| 国产亚洲日韩欧| 国产成久久综合片| 国产精品熟女九色九色蜜臀| 久久综合亚洲色1080p| 色欲久久久久综合网| 日韩综合无码一区久久92| 淫荡网址| 特级毛片特黄久久免费看| 国产成人欧美一区二区三区的国产| 激情小说图片亚洲首页| 91久久免费视频互動交流| A级在线视频| 超清福利精品视频在线| 国产精品嫩草久久久久| 欧美日韩性爱操大逼| 思思热er精品视频| 免费的av网| 亚洲少妇激情视频| 91青青| 美女91在线| 欧美人黑A片无码免视费| 国产精品96| 性久久| 久久婷婷综合国际产色怕| 999岛国大片| 91oumei| 一级二级在线观看| 99少妇精品视频| 天天爽天天干| 久草色悠悠在线视频| 怡红院成人av| 成人九九| 人妻中文字幕精品无码| 日韩性爱小视频在线观看| 开心五月婷婷激情| 亚洲天堂另类小说男人| 941超碰| 日韩综合97p| 国产婷婷综合在线观看| 伊人久久大香大香线蕉中文 | 激情第四色| 精爱久久| 99久久久| 国产成人自拍视频视频| 91狠狠色丁香婷婷综合久久精品| 亚洲美欧999| 亚洲 欧美 日本 国内 首页| 2019精品国产无码成人| 又黑又大又粗| 麻豆精品.欧美精品.日韩精品.| 偷拍偷窥与盗摄视频专区| 东北丰满熟女国产一区| 天美国产三级传媒| 大奶的诱惑| 操操逼操操逼操操逼逼| 天操天操夜操夜月操月年年操| 欧美色图自拍| 欧美成熟性爱精品| 欧美视频在线第3页| 9999九九九久久久| 日韩免费在线观看不卡| 激情五月婷| 一二三四视频在线社区中文字幕| 亚洲男人天堂网| 久久久久国产无av| 综合欧美日韩在线| 丰满人妻被猛烈进入中| 99热这里是精品| 熟女精品一区二区在线观看| 大学生口爆吞精| 成人熟女视频一区二区三区| 97资源久久| av资源在线观看少妇| 福利天堂| 厕所偷拍在线| 狠狠爱夜夜| 人人干人人操人人..com| 超碰97久久观看| 日韩性爱小视频| 97电影院超碰| 亚洲国产成人精品女人久久久| 五月丁香综合激情| 凌辱美少妇久久aV| 亚洲欧洲小说图片视频| 一级性爱视频免费观看| 日韩精品人妻中文字幕久久久| 翔田千里AV无码秘 三区| 亚洲国男人的天堂| 国产传媒av天美传媒在线| 五月综合色| 欧美色网络| 无码99| 久久精品店| 五月丁香六月激情综合| 97干在线视频| 亚洲 综合 欧美| 欧美精品宗合| 精品9区| 国产精品一二三在线看| 96一区二区三区| 五月天精品| 久久东京热久久| 国产精品老熟女一区二区| 青草综合| 久久精品国产99国产精品亚洲| 74成人在线| 久久久免费懂色| 无码精品人妻一区二区三区妖精| 欧美亚洲清纯| 日本免费中文一区二区三区四区 | 九九精品热| 成人青青草原伊人| 青青草吊丝| 17c在线成人免费A片观看| 成人欧美日超碰| 亚洲熟女av日韩熟女| 国产馆| 蜜桃在线观看一区二区三区| 亚洲午夜福利在线影院| 人妻丝袜日本| 91丝袜激情在线| 亚洲制服欧美另类内射| 久久精品人妻一区| 亭亭在线资源| 亚洲成人一二三区| 色婷久久| 成人26uuu| 天天操狠狠日夜夜干超大胆开放com大香蕉视频在线观看 | 中文无线日韩一区| 亚洲精品久| 亚洲天堂人妻熟妇视频| 亚州综合色| 亚洲 欧美 另类 日韩 人妻一区| 日本久久精品| 亚洲综合另类小说色区亚洲成av人片在www | 日日操夜夜操天天操免费观看麻豆| 人妻密肉在线观看| 欧美精品999| 日韩无码视频黄色| 日韩15p| 99精品久久久久久| 久久伊人青青草| 丰满人妻一区二区三区| 国产一区二区精品久久99| 中文字幕三四五区| 大白逼三四级| 国产小炒后入式| 日韩免费人妻色情网站| 国产福利第一视频| 人人人人插| 五月丁香黄色网| 99999国产| 欧美日韩插逼视频| 超碰九7| 男女性扦B| 久超超碰| 成人久久精品| 99久久综合| 曰韩欧美国产传媒麻豆第一区| 婷婷视频在线免费观看| 岛国网址国产| 亚洲欧美日韩精品久| 人人摸.人人色| 香港澳门日本三级网站| 国产女大学生AV| 欧美色九九| 天堂av最新电影网| 91成人亚洲色图| 精品人妻伦一区二区三区久久| 伊人网在线视频| 情色五月天久久久| 亚洲天堂第一页| 亚洲狼狼干综合1| 色老汉色| 日韩天天本| 人人妻人人色| B049AV在线播放| 色大师网站www永久网站视频| 国产夫妻一区二区| 欧美丝袜激情| 99黄页网站| 热热热热日日漂亮永久永久国产日| 久久国产精品,久久国产| 97久久资源| 国产女人高潮视频| 97操97色| 婷婷另类小说| 青青草中日韩在线| 91蜜臀人妻中文字幕在线| 青青草大香蕉视频| 欧美日韩97| 亚洲色图欧美一区二区不卡| 中文操逼字幕| 黄骗免费| 99久久久99久久91熟女| 超碰国产情侣自拍网| 女同性恋一区二区三区精品视频| 亚洲精品蜜桃久久久久久久| 97超碰伊人| 极品色综合| 试看日韩黄片| 成年人一级黄色毛片大全在线观看| 91人妻Pr| 色哟哟-国产专区| 蜜桃色院一区久久| 麻豆一区二区三区在线看| 97免费在线观看| 精品久久久久久无码| 日本性爱不卡视频| 视频在线观看一二三区| 男人天堂最新手机版在线青青草| 校园春色五月天| 一级毛片久久久久久久女人18| 家庭乱伦网站国产| 欧美爆操91| 热热色青青草| 亚洲密乳AV| 九月婷婷久久| 久久99草| 精品一区二区三区国产| 99久久九九| 青青国产在线拍揄自揄拍| 久久风骚城市| 视频在线观看免费一区二区三区| 色婷婷综合久久久久中文国产精品一区中文字幕,国产福利电影一区二区三区 | 97任你吞精| 欧美大码在线视频| 久久婷婷苹果| 亚洲欧美日韩二区视频| 中文字暮97| 美国三级日本三级久久99| 国产一国产一级毛片古装| 日本操BAV| 欧亚不卡| 日韩电影在线观看网址| 五月婷婷色色| 欧美桃色网| 免费伦费视频在线观看| 九九热超碰97亚洲最新香蕉| 成人久久久| 欧美刺激色黄片免费看| 蜜桃久久久久久久久久久久| 亚洲无码 国产无码| 香蕉婷婷| 国产乱不卡| 小日子操bb在线看| 在线 亚洲 网爆 自拍| 蜜臀视频网站| 熟女精品一区二区三区| 好吊色综合| 丁香五月天社区| 亚洲美腿丝袜香蕉影视欧美成人| 亚欧性爱ab| 国产一| 免费精品中文字幕| 久久久久斤小| 亚洲欧美日韩精品久| 精品国产国产AV| 亚洲人体视频在线观看| 天天日日本| 免费试看60秒| 精品小视频在线| 天天谢天天干| 亚洲综合夜色| 亚州AV无码国产精品| 手机av亚洲丝袜美腿日韩第一页二页| 欧美一级久久久丰满| 蜜桃视频一区二区三区在线观看| 成人26uuu| 伊人一区二区三区| 亚洲一区二区三区AV无码 | 精品人妻av在线播放| 精品176精品2| 乱伦AVxx| 亚洲久9| 97久久精品亚洲| 亚洲91在线| 啊啊啊好湿久久| 国产一区二区三区久久久精品| 亚洲人妖网| 成人午夜小视频手机在线看| 亚春色色| 一及黄久一点| 日韩欧美经典在线观看| 亚洲激情视频| 狠狠躁天天躁日日躁| 欧美麻豆成人同性GⅤ在线| av影院十区| 亚洲欧美激情另类色图| 日本欧美韩国国产在线| 91激情国产| 久久久九97| 亚欧毛片基地国产毛片基地| 国内精品久9| 精品一区二区3区| 久久久亚洲Av| 日韩人妻无码不卡网站| 亚洲永久AV无码精品秋霞| 九月丁香综合网| 亚洲久久久| 国产成人主播| 男人的天堂2010| 在线看的av| 老鸭窝成人免费毛片视频| 日韩99神马视频片| 日本99久久| 岛国在线免费视频| 熟女少妇视频| 亚洲的天堂网| 成人熟女视频一区二区三区| 九九热精品在线| 免费人成在线观看网站品爱网| 亚洲 欧美 日韩另类 麻豆| 日韩AV一区二区三区三州三州| 中文字幕成人理论在线| 免费国产电影一区二区| 嗯嗯啊啊啊好爽| 校园春色宗合网| 97国产超湿| 人妻激情偷乱视三区频一区二区| 51久久夜色精品国产麻豆| 久草这里只有精品 | www.色婷婷色综合| 中国大陆国产高清AⅤ毛片| 97在线免费视频观看| 九九综合网| 欧美性暴力猛交XXXX| 激情五月天丁香| 国产三级中文有码在线视频| 丰满人妻一区二区三区性色| 男啪女色黄无遮挡免费观看| 99re黄 | 亚洲美女自拍偷拍视频| 操逼免费视频无码国产| 国产精品不卡一区二区三区av| 91色夜| 亚洲自拍小说| 欧美色图小说综合| 无码精品啪啪啪一区二区三区三州| 日日夜夜青青草母狗| 暖暖精品二区三区观看| 日韩pv中文| 久操综合在线| 小草三级久久观看| 人妻啊啊人妻啊| 国产这里只有精品| 国内91熟女人妻丝袜天天精品视频在线| 日本精品高清一二区一本到| 日本视频在线观看污污污| 秋霞久久亚洲精品成人| 国产精品无码av在线 | 1204金沙人妻懂旧版免费| 色第一页| 二三四区精品| 夜夜夜夜爽| 国产AV天美传媒一区二区三区 | 中日韩免费看男女操逼大全| 日韩成人性日韩成人性爱视频在线免费观看 | 色黄污美女啪啪啪免费网站| 天天操天天射天天日| 熟女乱伦A| 国产精品人妻熟女aⅴ| 精品人妻av在线播放| 操逼视频亚洲| 日本人妻A片成人免费看片| 国产成人+综合亚洲+天堂| 亚洲中文字幕网| 丁香久久| 天天享受天天看| 韩国国产欧美情侣视频在线| www.acm成人黄色毛片| 青青草在线视频美女| 久久高潮妇女视频| 翔田千里无码一区| 国产综合网站在线播放 | 伊人久久在线视频观看| 不卡免费av在线播放| 精品一区二区三区蜜桃臀赵总 | 青青草华人在线欧美在线| 色欲久久99国产精品久久久久久| 家庭乱伦麻豆| 一本一道vs波多野结衣| 久久久久久亚洲精品不卡人乳| 中文有码第五页| 天天爱综合网| 日本一区二区中文字幕久久| 97色97好| 久9爱精品| 国产日韩精品suv| 夜夜影视四色| 精品无码一区二区| 欧美偷偷网| 91人妻少妇| 国产高清精品福利| 久久e6只有精品| 91色综合色| 黄色视频高清无码网站| 亚洲黑人在线| 久久无码电影| 涩五月婷婷| 韩日精品福利视频一区不卡在线免| 五月天久久人妻| 国产又黄又爽又刺激久久久久久 | 99热婷婷一区二区三| 国产精品久久久吖| 婷婷久久综合久| 亚洲成人精品久久久| 91色欧美| 狠狠色狠狠色狠狠五月| 日本97久久久精品| 亚洲中文字幕一区二区| 福利视频一区二区微拍| 久热久一区二区三区| 国产精品午夜福利| 国产精品激情久久久久久久| AV一二区| 亚洲色天| www.婷婷| 亚洲激情在线| 亚洲国产激情国产av| 天天天天天超碰| 中国AAAAAA黄色片| 国产亚洲 中文欧美久久| com 首页 18岁 禁区 女优 免费 精选 同城| 婷婷av在线中文字幕| 黑丝少妇| 亚洲不雅视频1区二区| 国产97色在线| 97在线日韩中文字幕| 欧美aaaaaaa| 91亚州欧美| 亚洲网站一区二区在线| 欧美综合骚| 久久这里只有精品9| 欧美激情综合| 男同专区一区二区三区在线| 99操逼| 2017,超碰| 九九Av| 99999国产| 99久热| 超碰美国| 亚洲色堂免费视频| 国产精品com| 99国产精品在线观看| 新亚洲无码| 后入人妻一区| 无码精品久久| 中文字幕超碰CAO| 久久成人午夜精品影院 | 黄色在线网站| 超碰到97情色| www久| 国产精品诱惑| 青青操在线亚洲视频观看欧美在线 | 伊人99热| 白丝av| 日韩av色图综合| 蜜桃视频成a人v在线| 亚洲AV在线资源| 熟女被操视频网址| 狠狠爱综合网| 久草综合视频| 国产福利第一视频| av影片在线观看不卡| 欧美美女在线高潮999| 国产网红精品| 久区视频| 中文字日本乱码| 人妻 丝袜美腿 中文字幕| 超碰欧美97资源| 欧美性天天影视| 成人AV超碰免费在线| 97精品在线| 日本色色网| 91在线免费观看处女| 大香蕉宗合网在线| 丝袜综合网| 97人妻免费中文字幕| 久久久精品九| 欧美少妇一区二区三区| 亚洲一卡2卡3卡4卡乱码网站| 亚洲乱色熟女一区| 久9爱经典视频| 中文字幕二区日韩天堂| 久久无码成人| 亚洲日韩美女丝袜美腿人妻视频| 91国产美女丝袜足交精品视频 | 久久精品老司| www.色99| 操www| 97在线视频网站| 成人一区二区三区四区| 日本 欧美 亚中文字幕| 欧美日韩在线国产在线| 91内射| 五十路成人在线视频二区三区| 大香蕉伊人一区在线观看| 国产精品自在线发布| 草草电影院| 久久久久久人| 日日噜噜夜夜久久亚洲一区二区| 97超碰色五月| 99re久久| 国产亚洲日本精品在线| 欧美18 在线观看| 九热中文字幕| 国产精品夜夜夜| 自拍视频大全亚洲专媒视频/一区二区三区 | 操逼国产免费| 国产高清自拍视频| 九九九成人| 天天综合网合集91| www.AV有限公司一区| 99青草| 久久草草欧美精品| 大香蕉黄色一区| 91成人久久| 韩国一级AAA| 日韩免费高清大片在线| 2020久久免费视频| 欧美美女视频| 中文 人妻 制服| 加勒比无码毛片| 日韩人妻精品| 欧美黑人91| 人妻熟妇久草在线| 偷拍综合亚洲| 91高潮喷水美女| 欧美亚洲激情一二三| 干B| 欧美 亚洲 另类 综合| 日韩国产十八禁| 妇人噜噜| 亚洲十八禁止| 在线亚洲丝袜视频网站| 亚洲精品蜜桃久久久久久久| 新视频sss国产| 国产精品不卡一区二区三区| 国产情色第一第二页在线观看| 久久同城AV| 九九九热精品| 91在线国产后入风骚翘臀美女素人| 亚洲AV色图一区| 丰满熟妇大乳做爰| 91国产丝袜白虎| 资源新线在线天堂| 嗯嗯啊啊操我| 性色av大全| 约操熟妇| 亚洲成av人片色午夜乱码| 五月丁香啪啪啪| 99热色这里只有精品| 午夜福利久久久噜久噜久久综合 | 久久久女人| 久操免费观看| 最新无码国产| 2019久久久久久久久福利| 日韩国产乱子伦App| 90后性网国产欧美| 情色日播放AV| 内射卯月麻衣| 夜夜欧美 | 精品然女一区二区| 久久精品91| 97碰久久| 草草影院日本第一页| WWW黄片COM| 久久色激情一区二区三区| 亚洲欧美国产中文视频| 久久精品国产亚洲妲己影视| 亚洲av无线观看| 操碰97| 亚洲永久AV无码精品秋霞| 亚洲日韩黑丝| 一级黄色性爱裸体视频| 秋霞久久亚洲精品成人| 亚洲国产激情国产av| av操操不卡| 精品大全99999| 无码久久国产 | 日韩色图 一区二区| 中出欧美| 操逼逼福利视频| 少妇国产不卡| 骚妻少妇精品性色无码四色A V| 91美女在线观看| 国产精品久久久无码AV网站| 国产超碰国产97| 后入式五六区| 亚洲欧洲自拍图片专区满春格| 日本福利二区视频| 久久亚洲熟妇在线视频| 性91| 亚洲欧美激情在线视频| 国产精品高潮久久AV| 九九九九九精品视频| 色狠狠 - 百度| 人妻日日夜夜精品| 欧美啪啪啪91| 天堂中文日本在线观看| 台湾佬中文娱乐自偷自拍| 久久精品区| 日本人人操人人操| 人妻 制服 日韩 中文 在线| 国产精品福利视频| av九九| 国产AV天美传媒一区二区三区| 91在线秘 男同| 啊好大好舒服| 日本Suv精品一区二区| 久操视频资源站公开| 嗯嗯,好大,好爽,好骚| 激情综合网激情综合| 五月天色图| 女人天堂网| 嫩草影院在线观看精品| 操b网站亚洲无码| 欧美黄色手机在线观看| 欧美日韩情色一区二区| 97chaopengongkai| 能看的AV| 91色婷婷综合久久中文字幕二区| www色色色com| 久久久无码精品人妻二区| 欧美性爱十八禁| 一区二区三区在线日韩影院观看| 亚洲第一黄色av网站| 久久久专区| 日韩人妻中文视频| 九九av| 在线精品福利免费播放| 综合色久欲| 天天干人妇| 中文字幕免费在线观看| 人人扣人人操| 男人的天堂com| 欧美性爱五月天| 少妇久久久久| 九九热五区| 特级特黄一级毛片免费| 日本新免费二区三区| 日美免费黄片| 亚洲中文字幕久久无码精品| 五月丁香激情综合| 欧美精品三级黄片| 欧美色图中文字幕| 国产熟女完整版中字| 四虎在线免费视频| 久久99网站| 久久九色| 欧美一区二区成人一卡| 亚洲天堂7777| 久久精品无码一区二区三区| 欧美日韩99精品麻豆传媒| 亚州熟女乱伦| 欧美色综合图片| 去干网最新版| 成·人免费午夜在线观看| 亚洲宗合电影| 精品伊人久久久大香线蕉小说| 东北老熟女| 欧美亚综合色图| 成人亚欧免费视频| 少妇无码999| 色婷婷在线视频精品导航| 欧美老妇曰批的视频| 久久九九久精品国产尤物|国产精品爽黄69天堂A片潘金莲,国产亚洲精品第一综合 | 男人的天堂在线有码| 9国产超碰| 妇女乱色二区| 麻豆av一区二区三区| 日韩不卡在线一区二区| 欧美性爱一区二区三区| 91精品丝袜久久久久久无码人妻| 黄片www.| CCYY草草影院地址入口| 无码精品啪啪啪一区二区三区三州| 久久亚洲不卡| 青青伊人这里只有精品| 女人久久久| 欧美玖玖爱免费玖玖| 超碰亚洲欧美日韩无| 成人亚欧免费视频| 欧美色女人| 国产不卡的视频| 高清不卡一二三区视频......| 亚洲天堂人妻熟妇视频| 极品销魂美女一区二区| 九草九九九| 亚洲欧美性生活| 久热这里| 婷婷五月天激情网| 丁香五六月啪啪| 久久东京热成人| 亚洲电影91| 久久婷婷在线观看视频| 日日操天天操| 国产精品岛国片在线观看| 人人人摸人人| 风月影院十八禁| 久射吧| 色综合超碰超| 日日橹狠狠爱欧美超碰| 尻女朋友一夜| 99激情| 在线不卡视频| 国产精品无码论坛| 国产精品女久久久久av爽| 久久久久亚洲熟妇熟女| 少妇久久久久久久| 欧美精品庄| 97超级久久| 51一区二区三区| 亚洲综合校园春色| 狠狠2050在线观看| 99色婷婷中文字幕乱色| 久久一二三级一一一| 国产不卡精品91| 91久久久久免| 成人在线日韩| 天天天天干| 婷婷综合五月| 99久久99久久综合| 亚洲精品三| 中国探花熟女| 亚洲色综合| 可以免费观看的av| 婷婷伊人綜合中文字幕| 一级黄色影片| 天天天天操| 日韩一区二区精品视频| 丁香六月婷婷久久综合| 美女刺激久久国产欧美| 综合色图亚洲欧美| 清纯唯美激情四射| 自拍盗摄一区| 啊啊啊啊二区好大| 99蜜桃臀亚洲成人在线观看| 中文字幕AV片| 亚洲精品黑丝| 国产精品伦理| 囯产精品久久久久久久久久二区三区| 91成人无码| 国产精品懂色tv影视免费观看 | 久久999久| 日本中文字幕一区| 99在线精品观看视频中文| 少妇大屁屁| 91亚州| 精品国产乱码| 国产福利av精彩对白| 91精品丝袜在线观看| 人妻天堂综合网| 亚洲情色一区综合| 干B| 9精品久久久久| 久久天堂| 午夜偷拍久久熟女| 婷婷五月天色色| 国产极品999| 国产精品第二页| 欧洲色综合| 97爱综合| 国产精品视频一区二区三区八戒| 91精品丝袜久久久久久| 日韩99999色| 天天摸天天舔天天操| 国产精品白丝AV| 亚洲中字幕日本一区二区三区| 精品九九国产无码| 激情综合五| 亚洲大色堂| 精品在线78| 极品综合| 91久久久久久| 四虎884a| 天啪| 欧美强奸乱| 青青草视频爽一爽| 清纯唯美综合亚洲| jizz啪啪| 丁香五月激情综合| 青女在线| 97超碰站| 91麻豆va国产精品| 亚州再线| 久久超碰97| 亚洲中文日韩精品| 色老汉色| 欧美色性情| 日本一区二区三区四区免费观看| 一区久久久二区| 9久9久9久9久视频网站| 免费一级黄色录像影片| 91人人爽人人爽人人人,gav福利视频导航,日韩欧美亚洲国产字幕四区 | 丁香五月成人| 久久AV色| 亚洲啪啪视频免费| 欧美性天天影视| 亚洲有薄码区久久在线一区| 国产强奸乱伦xd| 日韩欧美亚洲国产日韩| 91欧美情色| 国产精品无码论坛| 60秒免费小视频| 你懂的在线观看区国产| 久操大香蕉手机视频在线看| 91网站18+| 国产成年免费大片黄在线观看| 日韩天堂av电影在线观看| 9Ⅰ超碰| 国产精品视频精品一二| 大屁股国产在线视频| 操操逼视频| 蜜臀AV一区二区三区激情综合| 91岛国动作片| AV大香蕉| 久久久久白虎| 中文字幕在线观看视频www| 玖玖大干人妻| 免费观看的黄色的网站| 色哟哟1区2区| 国产精品亚洲天堂网址| 今日头条成人一区二区三区四虎精品| 男女啪啪啪18禁网站| 丝袜夫妻自拍| 久久AV无码AV| 极品白嫩福利在线| av激情亚洲五月天| 91爱综合| 国产h小视频在线观看免费| 骚货| 国产强奸乱伦无码视频| 少妇被玩视频二三区| 国产精品999aaa| 蜜桃在线观看一区二区三区| 日本操逼视频不卡直接放| 99 国产丝袜在线| 欧美 日韩 亚洲 春色| 97一区二压| 最新中文字幕在线亚洲| 人妻喷水| 五月天偷拍| 羞涩视频| 99啪啪| 久久久久久久国产a∨| 天天操熟妇| 五月丁香激情啪啪| 加勒比综合| 日韩99神马视频播放| 青娱乐亚洲自拍| 欧美图片色五月天| 婷婷激情五月| 亚洲婷婷综合网| 欧美青青视频| 亚洲AV无码成人精品久久| 91观看 国产白丝| 97舔舔| 亚洲欧美在线观看免费| 极品出轨视频网站| 欧美成人9797| 中国一级操逼视频| 1204人成网站色www| 亚洲日产专区| 日韩黄色av中文字幕| 色九九九九九九| 一区二区三区网站日日骚| 免费精品中文字幕| www.91视频网| 夜夜骑天天燥| 五月婷婷色| 7777奇米影视久久| 好湿好紧视频| 97色色色综合网站| 日本肉体xxxx裸交| 人妻一区二区三区四区视频| 亚洲诱惑天堂| 大香蕉在线视频15| 中文字幕aⅴ在线视频| 性猛交| wuyechaopeng| 操我啊啊啊啊啊| 99日精品欧美国产| 久久精品国产亚洲AV清纯| 久久久神马影院| 熟妇亚洲一区二区三区| 亚洲 欧美日韩 另类| 欧美97| 欧美三四五区| 男生女生啊啊啊啊| 香蕉在线一区二区三区| 欧美老妇曰批的视频| 欧美性天天| 后入福利| 欧美91精彩| 久久久99久9| 国模精品一区二区三区苹果色戒| 美女视频尤物网在线看| 视频不卡中文字幕| 久久熟女精品不卡一区| 色大香蕉97N| 亚洲国产剧情少妇激情| 看一级黄色视频| 国产自产自拍| 亚洲高清无毛一区二区| av天堂电影网| 超碰9 7女人| 很很很很操| 中文字幕88av在线| 久久国产99精品72福利| 色五月首页| 人妻熟女av国产网站| 亚州操逼图| WWW操逼| 在线播放成人高清免费视频| 日韩少妇无码| 加勒比海人人操超碰在线| 人妻天天爽夜夜爽2| 欧美天堂超碰97| 韩国女主播青草在线| 精品免费1| 综合网,亚洲,欧美| 人妻AV 中文字幕的| 任你艹| 丁香六月啪啪| 精品人妻伦一二三区久久| 婬女免费一二三区A片| 亚洲美女自拍偷拍视频| 91快色色色色色| 亚洲精品无码成人久久久99| 欧美国产精品| 欧美性爱第一区| 岛国视频一二三区| 国产传媒操逼视频| 伊人网综合在线视频| 亚洲av综合色区无码一| 美国一区二区三区视频| 一区二区影院| 亚洲国产一级精品毛一级精品看免费视频| 综合久久99亚洲人妻中文在线| 久夜操| 欧美日本不卡在线| 久久久啊啊啊| 四方色播| 女色综合| 久热影视| 强奸乱伦大香蕉| 久久精品国产亚洲AV无码电影| 成人性爱高清视频免费看| 日韩女模中文造逼| 色婷婷网|