Ftrace源碼分析系列之objtrace

原創(chuàng) Linux閱碼場 2022-06-21 08:00


Ftrace訓(xùn)練營火熱報名中:Ftrace訓(xùn)練營:站在設(shè)計者的角度來理解ftrace(限50人)。訓(xùn)練營第一期報名已圓滿成功,好評如潮。第二期報名正在火爆進行中(咨詢小月微信:linuxer2016)。


ARM安全架構(gòu)訓(xùn)練營火熱報名中:閱碼場訓(xùn)練營:ARM安全架構(gòu)之Trustzone-TEE實戰(zhàn)。報名咨詢客服(小月微信:linuxer2016)。


ARM架構(gòu)與調(diào)優(yōu)調(diào)試訓(xùn)練營火熱報名中:閱碼場訓(xùn)練營:ARM架構(gòu)與調(diào)試調(diào)優(yōu)。報名咨詢客服(小月微信:linuxer2016)。



作者介紹:
陳松,畢業(yè)于天津大學(xué)精密儀器專業(yè)。先后在索尼愛立信,意法愛立信和華為技術(shù)有限公司任軟件工程師,軟件架構(gòu)師等職務(wù),主要負(fù)責(zé)手機內(nèi)核和應(yīng)用的開發(fā)工作。2019年加入麒麟,現(xiàn)任裝備事業(yè)部軟件工程師,主要負(fù)責(zé)實時內(nèi)核研發(fā)和新技術(shù)預(yù)研等工作。


1、objtrace和Ftrace的關(guān)系


我們在內(nèi)核代碼調(diào)試過程中,經(jīng)常會遇到需要跟蹤函數(shù)參數(shù)值變化的情況,objtrace是一個非常有創(chuàng)造性的工具,它可以將我們從笨重的調(diào)試工作中解脫出來,讓我們能夠很簡潔,直觀而且優(yōu)雅的找到我們期望在代碼中發(fā)現(xiàn)的內(nèi)容。


Kprobe和function tracer共建于ftrace的基礎(chǔ)設(shè)施,objtrace將二者巧妙的結(jié)合起來,在開發(fā)者設(shè)置了kprobe的時候,objtrace打開了function tracer,并注冊了回調(diào)函數(shù)。


當(dāng)代碼運行到kprobe關(guān)聯(lián)的函數(shù)的時候,objtrace將開發(fā)者所設(shè)定的參數(shù)的地址,偏移量,大小等信息保存起來。


之后,當(dāng)內(nèi)核代碼運行到任何一個function tracer可以跟蹤的函數(shù)的時候,objtrace都會將該函數(shù)的參數(shù)依次取出來,與已經(jīng)存儲的,需要跟蹤的參數(shù)的地址進行比對,如果發(fā)現(xiàn)符合條件的話,就將參數(shù)的值打印到ftrace中。


2、如何獲取objtrace源代碼


Objtrace的源碼最早由閱碼場資深用戶Jeff?Xie提交給內(nèi)核社區(qū),大家可以在github上找到,大家可以下載,編譯,試用,很便捷。目前objtrace應(yīng)該已經(jīng)到了v12,大家找到v12的分支即可。作者之前一直在v10上調(diào)試,下載代碼的命令:git clone -b objtrace-v10 https://github.com/x-lugoo/linux.git


3、功能描述


我們在開發(fā)和調(diào)試代碼的過程中,經(jīng)常會遇到一個場景,變量在函數(shù)之間傳遞的過程中,我們需要追蹤這個變量的值變化的過程,比如下面這個例子中的bio:


bio_add_page(struct bio *bio ...) -->__bio_try_merge_page(bio ...) -->         bio_flagged(bio...)   __bio_add_page(bio...)...


通常,我們會增加很多printk,然后編譯安裝內(nèi)核,重啟。如果有的函數(shù)分支忽略掉的話,還需要再增加printk,再次編譯安裝內(nèi)核和重啟,是不是很笨重?


內(nèi)核中的kprobe提供了可以不用修改代碼而直接查看函數(shù)參數(shù)值的方法:


cd /sys/kernel/debug/tracingecho 'p bio_add_page arg1=$arg1 arg2=$arg2' > ./kprobe_eventsecho 1 > events/kprobes/p_bio_add_page_0/enablecat your_file > /dev/nullcat trace
jbd2/sda5-8-220 [000] ...1. 55531.677782: p_bio_add_page_0: (bio_add_page+0x0/0x90) arg1=0xffff8ecac98aba00 arg2=0xfffff58a0122a400 jbd2/sda5-8-220 [000] ...1. 55531.677786: p_bio_add_page_0: (bio_add_page+0x0/0x90) arg1=0xffff8ecac98abc00 arg2=0xfffff58a04141140 jbd2/sda5-8-220 [000] ...1. 55531.677790: p_bio_add_page_0: (bio_add_page+0x0/0x90) arg1=0xffff8ecac98ab100 arg2=0xfffff58a02e9f880 jbd2/sda5-8-220 [000] ...1. 55531.677794: p_bio_add_page_0: (bio_add_page+0x0/0x90) arg1=0xffff8ecac98ab300 arg2=0xfffff58a041d1b00 jbd2/sda5-8-220 [000] ...1. 55531.677798: p_bio_add_page_0: (bio_add_page+0x0/0x90) arg1=0xffff8ecac98ab600 arg2=0xfffff58a04141280...


Kprobe利用了ftrace中function tracer的架構(gòu),將代碼段中__fentry__(或__mcount)替換為kprobe_ftrace_handler,kprobe_ftrace_handler將函數(shù)名稱和參數(shù)值打印到了ftraceringbuffer之中。


但還有一個問題,kprobe只能追蹤變量在bio_add_page內(nèi)的值,不能跟蹤變量在其之后的變化。


國內(nèi)社區(qū)的jeff老師近期開發(fā)了objtrace可以實現(xiàn)變量持續(xù)跟蹤的功能,objtrace結(jié)合使用了kprobe和function tracer的功能,持續(xù)跟蹤一個或多個變量,同時還可以設(shè)置偏移量,獲取變量結(jié)構(gòu)內(nèi)部元素的值。


目前objtrace正在評審中,很快就會進入到內(nèi)核代碼樹的主線。


4、使用方法


1)進入debugfs的目錄:


cd /sys/kernel/debug/tracing


2)設(shè)置kprobe


echo 'p bio_add_page arg1=$arg1 arg2=$arg2' > ./kprobe_events查看kprobe:ls events/kprobes/ -al里面增加了p_bio_add_page_0cat events/kprobes/p_bio_add_page_0/trigger# Available triggers:# traceon traceoff snapshot stacktrace enable_event disable_event enable_hist disable_hist hist objtrace
可以看到除了原有的traceon traceoff snapshot stacktrace之外,增加了一個新的觸發(fā)器objtrace


3)設(shè)置objtrace


echo 'objtrace:add:arg1,0x28:u32:5 if comm == "cat"' > ./events/kprobes/p_bio_add_page_0/trigger表示在kprobe:bio_add_page需要跟蹤第一個參數(shù),也就是結(jié)構(gòu)bio偏移量為0x28的變量的值。cat events/kprobes/p_bio_add_page_0/triggerobjtrace:add:arg1,0x28:u32:count=0 if comm == "cat"


4)觸發(fā)


cat your_file > /dev/null  //讀取一個大文件,觸發(fā)bio_add_page,也就是內(nèi)核需要調(diào)用到bio_add_page函數(shù)


5)查看日志


cat trace# tracer: nop## entries-in-buffer/entries-written: 309/401   #P:4##                                _-----=> irqs-off/BH-disabled#                               / _----=> need-resched#                              | / _---=> hardirq/softirq#                              || / _--=> preempt-depth#                              ||| / _-=> migrate-disable#                              |||| /     delay#           TASK-PID     CPU#  |||||  TIMESTAMP  FUNCTION#              | |         |   |||||     |         |    kworker/3:1H-79      [003] ...1.   248.076143: wbt_issue <-__rq_qos_issue object:0xffffa0c886cc8700 value:0x1000    kworker/3:1H-79      [003] ...1.   248.076143: blk_add_timer <-blk_mq_start_request object:0xffffa0c886cc8700 value:0x1000##### CPU 1 buffer started ####          -0       [001] .Ns2.   248.080898: bio_endio <-blk_update_request object:0xffffa0c886cc8700 value:0x0          -0       [001] .Ns2.   248.080900: __rq_qos_done_bio <-bio_endio object:0xffffa0c886cc8700 value:0x0          -0       [001] .Ns2.   248.080900: bio_uninit <-bio_endio object:0xffffa0c886cc8700 value:0x0          -0       [001] .Ns2.   248.080901: bio_uninit <-bio_endio object:0xffffa0c886cc8700 value:0x0          -0       [001] .Ns2.   248.080901: __rcu_read_lock <-bio_uninit object:0xffffa0c886cc8700 value:0x0??????????-0???????[001]?.Ns2.???248.080901:?__rcu_read_lock?<-bio_uninit?object:0xffffa0c886cc8700?value:0x0



5、代碼分析


5.1初始化


初始化就是讓內(nèi)核的ftrace架構(gòu)知道有objtrace這樣的一個trigger(觸發(fā)器),當(dāng)開發(fā)者創(chuàng)建一個kprobe的時候,在這個kprobetrigger目錄下,會出現(xiàn)objtrace的選項。代碼流程如下:


start_kernel -->trace_init -->trace_event_init -->event_trace_enable -->register_trigger_cmds -->register_trigger_object_cmd -- > register_event_command(&trigger_object_cmd); 注冊trigger_object_cmdtrigger_object_cmd包含了event_command所需要的函數(shù),如event_object_trigger_parse就是工程是輸入objtrace:add...之后,將這個字符串解析的過程。static struct event_command trigger_object_cmd = {     .name           = "objtrace",     .trigger_type       = ETT_TRACE_OBJECT,     .flags          = EVENT_CMD_FL_NEEDS_REC,     .parse          = event_object_trigger_parse,     .reg            = register_trigger,     .unreg          = unregister_trigger,     .get_trigger_ops    = objecttrace_get_trigger_ops,     .set_filter     = set_trigger_filter, };
此外,start_kernel還有一個路徑初始化objtrace的另一部分start_kernel -->early_trace_init -->tracer_alloc_buffers -->allocate_objtrace_dataallocate_objtrace_data中申請并初始化了一個結(jié)構(gòu)體objtrace_data *obj_data,其中最重要的是obj_data->fops->func = trace_object_events_call,函數(shù)trace_object_events_call負(fù)責(zé)跟蹤參數(shù)值并打印到ftrace的ring buffer中,可以說trace_object_events_call是objtrace中最重要的一個函數(shù)。注意,此時trace_object_events_call只是放到了obj_data->fops->func中,并沒有開始使用。


5.2設(shè)置 “echo 'objtrace:add:arg1,0x28:u32:5 if comm == "cat"' > ./events/kprobes/p_bio_add_page_0/trigger”


當(dāng)開發(fā)者輸入這個命令的時候,系統(tǒng)需要將 'objtrace:add:arg1,0x28:u32:5 if comm == "cat"' 解析出來,并調(diào)用event_trigger_register注冊到ftrace中,這樣當(dāng)內(nèi)核走到bio_add_page這個函數(shù)的時候,就會觸發(fā)kprobe。函數(shù)調(diào)用過程如下:我在event_trigger_set_filter中增加了一個WARN_ONCE,可以看到調(diào)用棧,同時在event_object_trigger_parse中增加了一個printk,看到一些變量。通常我都是使用function_grath來看代碼調(diào)用的流程,但ftrace本身的函數(shù)不能使用ftrace來觀測,這樣會造成遞歸調(diào)用,很不幸不是,只能使用這種笨辦法了:[  180.024670] chensong: event_object_trigger_parse :param:add:arg1,0x28:u32:5, objtrace_cmd:add[  180.024685] ------------[ cut here ]------------[  180.024688] chensong: set_trigger_filter, filter_str:if comm == "cat"[  180.024698] WARNING: CPU: 3 PID: 4332 at kernel/trace/trace_events_trigger.c:1056 set_trigger_filter+0x13d/0x170...[  180.024844] CPU: 3 PID: 4332 Comm: bash Not tainted 5.18.0-rc2-objtrace-v10+ #2[  180.024848] Hardware name: LENOVO YangTianT4900v-00/, BIOS FCKT65AUS 01/12/2015[  180.024851] RIP: 0010:set_trigger_filter+0x13d/0x170[  180.024856] Code: 83 c4 18 44 89 e0 5b 41 5c 41 5d 5d c3 48 89 fa 48 c7 c6 e0 15 23 84 48 c7 c7 15 e4 5a 84 c6 05 27 84 94 01 01 e8 d2 f7 9c 00 <0f> 0b 48 8b 45 d0 e9 f6 fe ff ff e8 73 57 a3 00 48 8b 7b 20 41 bc[  180.024859] RSP: 0018:ffffa28003a77d60 EFLAGS: 00010286...[  180.024879] CR2: 00007fbeb41fa020 CR3: 000000000a0f6003 CR4: 00000000001706e0[  180.024882] Call Trace:[  180.024884]  [  180.024888]  event_trigger_set_filter+0x22/0x30[  180.024894]  event_object_trigger_parse.cold+0x313/0x345[  180.024904]  trigger_process_regex+0xc1/0x110[  180.024908]  event_trigger_write+0x70/0xd0...[  180.024913]  vfs_write+0xc0/0x2b0[  180.024920]  ksys_write+0x67/0xe0[  180.024926]  __x64_sys_write+0x1a/0x20[  180.024931]  do_syscall_64+0x3b/0x90[  180.024937]  entry_SYSCALL_64_after_hwframe+0x44/0xae


event_object_trigger_parse首先解析objtrace:add:arg1,0x28:u32:5,并將結(jié)果保存到變量trigger_data中,最后調(diào)用event_trigger_register,過程如下:


static int event_object_trigger_parse(struct event_command *cmd_ops,... {     struct event_trigger_data *trigger_data;     struct objtrace_trigger_data *obj_data;           ...     obj_data->field = field;                                             --- (1)     obj_data->obj_offset = offset;     obj_data->obj_value_type_size = obj_value_type_size;     obj_data->tr = file->tr;     snprintf(obj_data->objtrace_cmd, OBJTRACE_CMD_LEN, objtrace_cmd);
trigger_data = event_trigger_alloc(cmd_ops, cmd, param, obj_data); ---(2) ... ret = event_trigger_set_filter(cmd_ops, file, filter, trigger_data); ---(3) if (ret < 0) goto out_free;
ret = event_trigger_register(cmd_ops, file, glob, trigger_data); ---(4) ... } int event_trigger_register(struct event_command *cmd_ops, { return cmd_ops->reg(glob, trigger_data, file); ---(5) } int event_trigger_set_filter(struct event_command *cmd_ops, { if (param && cmd_ops->set_filter) return cmd_ops->set_filter(param, trigger_data, file); ---(6) return 0; }
static struct event_command trigger_object_cmd = { --- (7) .name = "objtrace", .trigger_type = ETT_TRACE_OBJECT, .flags = EVENT_CMD_FL_NEEDS_REC, .parse = event_object_trigger_parse, .reg = register_trigger, .unreg = unregister_trigger, .get_trigger_ops = objecttrace_get_trigger_ops, .set_filter = set_trigger_filter, };


  • (1)解析的結(jié)果放到objtrace_trigger_data中。

  • (2)同時,將objtrace_trigger_data放置到event_trigger_data中。

  • (3)注冊filter,也就是if comm == "cat"

  • (4)注冊trigger。

  • (5)event_trigger_register就是調(diào)用trigger_object_cmd中的.reg,也就是register_trigger

  • (6)event_trigger_set_filter就是調(diào)用trigger_object_cmd中的.set_filter,也就是set_trigger_filter

  • (7)trigger_object_cmd的定義。


objtrace還有一個重要的工作,就是要跟蹤變量的流向,這個就超出了kprobe的功能范圍,需要借助function tracer了,所以kprobe部分還有一個重要的工作,就是使能function tracer。我花了很多時間來找如何使能function tracer的,一直沒有找到。但如果你了解function tracer的話,會知道在使能function tracer,必然會調(diào)用ftrace_replace_code來替換代碼段,將__fentry__(或__mcount)替換為ftrace_call,那么我就在ftrace_replace_code中增加一個WARN,看一下調(diào)用棧:


增加調(diào)試代碼:arch/x86/kernel/ftrace.c  +194  ftrace_replace_code    +static int counter = 0; void ftrace_replace_code(int enable) {                rec = ftrace_rec_iter_record(iter);+               WARN_ONCE(1, "chensong: ip:%pS \n", rec->ip);+               counter++;+               if (counter%100 == 0) +                 printk("chensong:%s, ip:%pS\n", __FUNCTION__, rec->ip);輸入echo 'objtrace:add:arg1,0x28:u32:5 if comm == "cat"' > ./events/kprobes/p_bio_add_page_0/trigger后,得到調(diào)用棧[  168.674941] chensong: ip:__traceiter_initcall_level+0x0/0x40 [  168.674954] WARNING: CPU: 3 PID: 3032 at arch/x86/kernel/ftrace.c:205 ftrace_replace_code+0x10b/0x1d0...[  168.675108] CPU: 3 PID: 3032 Comm: bash Not tainted 5.18.0-rc2-objtrace-v10+ #6[  168.675112] Hardware name: LENOVO YangTianT4900v-00/, BIOS FCKT65AUS 01/12/2015[  168.675115] RIP: 0010:ftrace_replace_code+0x10b/0x1d0[  168.675121] Code: 89 fe 89 c7 e8 f7 97 b4 00 5b 41 5c 41 5d 41 5e 41 5f 5d c3 48 8b 30 48 c7 c7 78 c5 b8 a5 c6 05 f0 6e ab 01 01 e8 4f f3 b3 00 <0f> 0b eb 80 e8 bc d1 13 00 31 db 45 85 f6 49 c7 c6 30 32 49 a6 0f[  168.675124] RSP: 0018:ffffb8a90299fc78 EFLAGS: 00010286[  168.675128] RAX: 0000000000000000 RBX: ffffffffa6493230 RCX: 0000000000000000...[  168.675149] Call Trace:[  168.675151]  [  168.675156]  ftrace_modify_all_code+0xcc/0x160[  168.675165]  arch_ftrace_update_code+0x9/0x10[  168.675170]  ftrace_run_update_code+0x1a/0x70[  168.675176]  ftrace_startup_enable+0x2e/0x50[  168.675181]  ftrace_startup+0xa8/0x120[  168.675185]  register_ftrace_function+0x25/0x70[  168.675189]  event_object_trigger_init+0x32/0x50[  168.675194]  register_trigger+0x69/0xd0[  168.675200]  event_trigger_register+0x1c/0x20[  168.675204]  event_object_trigger_parse+0x323/0x390[  168.675211]  trigger_process_regex+0xc1/0x110[  168.675216]  event_trigger_write+0x70/0xd0[  168.675221]  vfs_write+0xc0/0x2b0[  168.675228]  ksys_write+0x67/0xe0[  168.675234]  __x64_sys_write+0x1a/0x20[  168.675240]  do_syscall_64+0x3b/0x90[??168.675246]??entry_SYSCALL_64_after_hwframe+0x44/0xae


這部分代碼也是從register_trigger調(diào)用過來的,最終調(diào)用了


register_trigger -->event_object_trigger_init --> register_ftrace_function -->ftrace_modify_all_code其中,register_ftrace_function還將&tr->obj_data->fops注冊到function tracer的框架中,那么函數(shù)調(diào)用function tracer時,function tracer會調(diào)用tr->obj_data->fops中的回調(diào)函數(shù)func,也就是在allocate_objtrace_data中賦值的trace_object_events_call函數(shù),此時trace_object_events_call開始工作。


至此,function tracer被打開,以后內(nèi)核中所有可以trace的函數(shù),都將要走過function tracer這條路徑,也就是每一個函數(shù)調(diào)用之后,都會運行到trace_object_events_call中。


5.3觸發(fā) “cat /home/kylin/workspace/opensource/linux-objtrace-jeff/kernel/sched/core.c > /dev/null”


本節(jié)是objtrace中最重要的一個環(huán)節(jié),當(dāng)kprobe和objtrace都設(shè)置好了,一旦內(nèi)核調(diào)用到bio_add_page,就要開始跟蹤bio這個變量了,objtrace是如何在原有的kprobe的基礎(chǔ)上實現(xiàn)這個功能的呢?


我在閱讀代碼的時候,將這個過程分為兩部分,一個是kprobe,另一個是function tracer,我們先來看看當(dāng)kprobe被觸發(fā)的時候,objtrace做了什么工作:


同樣的,我還是使用了printk和WARN_ONCE來進行調(diào)試,我首先在函數(shù)set_trace_object中增加了一個WARN_ONCE,得到的調(diào)用棧如下:[  248.069971] chensong:set_trace_object, call stack of set trace object[  248.069980] WARNING: CPU: 3 PID: 4343 at kernel/trace/trace_object.c:162 trace_object_trigger+0x184/0x1a0....[  248.070450] Hardware name: LENOVO YangTianT4900v-00/, BIOS FCKT65AUS 01/12/2015[  248.070455] RIP: 0010:trace_object_trigger+0x184/0x1a0[  248.070462] Code: 7a ae 48 c7 c6 2d 69 3d ad e8 28 82 fe ff eb bc 48 c7 c6 60 05 43 ae 48 c7 c7 80 ce 7a ae c6 05 2c 11 95 01 01 e8 db 84 9d 00 <0f> 0b eb 9e 48 85 db 0f 84 16 ff ff ff 48 c7 c0 80 96 bc ae e9 d1[  248.070467] RSP: 0018:ffffb122007d36a8 EFLAGS: 00010086....[  248.070515] Call Trace:[  248.070520]  [  248.070533]  trace_object_count_trigger+0x1e/0x30[  248.070541]  event_triggers_call+0x5d/0xe0
[ 248.070556] trace_event_buffer_commit+0x1a2/0x260[ 248.070573] kprobe_trace_func+0x1ad/0x2a0[ 248.070602] kprobe_dispatcher+0x42/0x70

[ 248.070610] ? bio_add_page+0x1/0x90[ 248.070622] kprobe_ftrace_handler+0x168/0x1f0[ 248.070629] ? bio_add_page+0x5/0x90[ 248.070636] ? __bio_try_merge_page+0x140/0x140[ 248.070648] arch_ftrace_ops_list_func+0xe5/0x160[ 248.070655] ? submit_bh_wbc+0xca/0x140[ 248.070677] ftrace_regs_call+0x5/0x52[ 248.070689] RIP: 0010:bio_add_page+0x1/0x90....[ 248.070781] ? bio_add_page+0x5/0x90[ 248.070789] ? submit_bh_wbc+0xca/0x140



我們可以看到,當(dāng)bio_add_page被觸發(fā)之后,進入和kprobe的調(diào)用路徑:


bio_add_page -->ftrace_regs_call -->arch_ftrace_ops_list_func-->kprobe_ftrace_handler -->kprobe_dispatcher -->kprobe_trace_func -->event_triggers_call --> trace_object_count_trigger --> set_trace_object


其中trace_object_count_trigger也是trigger_object_cmd中定義的回調(diào)函數(shù),在trigger條件符合被觸發(fā)的時候被調(diào)用,我在set_trace_object中還增加了一個printk,打印obj的地址,也就是需要跟蹤的變量的地址。


   static void set_trace_object(void *obj, int obj_offset,             int obj_value_type_size, struct trace_array *tr){     unsigned long flags;     struct object_instance *obj_ins;     struct objtrace_data *obj_data;
... obj_ins = &obj_data->traced_obj[atomic_read(&obj_data->num_traced_obj)]; obj_ins->obj = obj; --- (1) printk("chensong:%s, obj:0x%lx", __FUNCTION__, obj); obj_ins->obj_value_type_size = obj_value_type_size; obj_ins->obj_offset = obj_offset; obj_ins->tr = tr; /* make sure the num_traced_obj update always appears after traced_obj update */ smp_wmb(); atomic_inc(&obj_data->num_traced_obj);
//WARN_ONCE(1, "chensong:%s, call stack of set trace object\n", __FUNCTION__); out: raw_spin_unlock_irqrestore(&obj_data->obj_data_lock, flags); }


(1)?這個時候內(nèi)核已經(jīng)走到了bio_add_page,所以已經(jīng)知道了bio的地址了,所以需要將bio的地址保存到object_instance的obj中,object_instance中其余的元素保存偏移量,變量大小等信息。


接下來是function tracer的部分,在上一部分講過,開發(fā)者運行命令“echo 'objtrace:add:arg1,0x28:u32:5 if comm == "cat"' > ./events/kprobes/p_bio_add_page_0/trigger”之后,function tracer被打開,以后內(nèi)核中所有可以trace的函數(shù),都將要走過function tracer這條路徑,每一個函數(shù)調(diào)用之后,都會運行到trace_object_events_call中,trace_object_events_call的代碼如下:


static voidtrace_object_events_call(unsigned long ip, unsigned long parent_ip,        struct ftrace_ops *op, struct ftrace_regs *fregs){    struct pt_regs *pt_regs = ftrace_get_regs(fregs);    int cpu, n;        for (n = 0; n < max_args_num; n++) {            obj = regs_get_kernel_argument(pt_regs, n);                            --- (1)            if (object_exist((void *)obj, tr)) {                                       --- (2)         ...                if (get_object_value(&val, (void *)(obj + obj_offset), val_type_size))  --- (3)                    continue;
submit_trace_object(ip, parent_ip, obj, val, tr); ---(4) }...}static inline unsigned long regs_get_register(struct pt_regs *regs, unsigned int offset){ return *(unsigned long *)((unsigned long)regs + offset); --- (5)}
static bool object_exist(void *obj, struct trace_array *tr){ ... for (i = 0; i < max; i++) { if (obj_data->traced_obj[i].obj == obj) --- (6) return true; } return false;}


  • (1)Function tracer使能后,每個可以trace的函數(shù)都會調(diào)用到trace_object_events_call中,調(diào)用棧如下:


Any kernel tracable function -->ftrace_regs_call -->    arch_ftrace_ops_list_func -->          __ftrace_ops_list_func -->              op->func(ip, parent_ip, op, fregs); -->                    trace_object_events_call -->                           get_object_value


trace_object_events_call首先調(diào)用regs_get_kernel_argument,依次獲得函數(shù)的參數(shù),本例中為bio_add_page的參數(shù)。

  • (2)調(diào)用object_exist來檢查是不是需要跟蹤的變量,這個變量的地址在開發(fā)者輸入cat file > /dev/null之后, 內(nèi)核代碼走到了bio_add_pagebio就會在set_trace_object中保存到了object_instanceobj中,所以在這個時候,后續(xù)函數(shù)如果使用了bioobject_exist返回為TRUE。如果內(nèi)核代碼沒有走到過bio_add_page或者該函數(shù)的參數(shù)中沒有bioobject_exist會返回FALSE

  • (3)獲取變量值,保存到val中。

  • (4)調(diào)用submit_trace_object將value打印到ftrace的ringbuffer中。

  • (5)regs_get_kernel_argument最終會調(diào)用到regs_get_register中,返回指定參數(shù)的地址。

  • (6)object_exist通過比較地址來判斷,當(dāng)前函數(shù)的參數(shù)中是不是包含需要跟蹤的變量。


好了,到此為止,objtrace的大部分工作都結(jié)束了,找到了變量,獲得了它的值,并打印到ringbuffer中,很巧妙,避免了大量的printk和WARN這樣笨重的方法。


但objtrace打開了所有函數(shù)的function tracer,每個函數(shù)都要去調(diào)用trace_object_events_call,還有調(diào)用object_exist進行變量的比對,會增加一定的系統(tǒng)開銷,所以objtrace最好不用和性能調(diào)試的trace一起工作。


5.4打印 cat trace


從debugfs的trace文件中打印到中斷,顯示給開發(fā)者,調(diào)用棧如下:


[ 1617.394055] chensong:trace_object_print[ 1617.394073] WARNING: CPU: 2 PID: 4761 at kernel/trace/trace_output.c:1567 trace_object_print+0x73/0x90
[ 1617.394733] RIP: 0010:trace_object_print+0x73/0x90[ 1617.394749] Code: c6 83 b5 fa b8 e8 9d 0d 00 00 4c 89 e7 be 0a 00 00 00 e8 d0 0a 00 00 48 c7 c6 30 f5 c2 b8 48 c7 c7 90 b5 fa b8 e8 ec a6 9e 00 <0f> 0b 4c 89 e7 e8 23 37 ff ff 5b 41 5c 5d c3 0f 0b eb 97 66 2e 0f
[ 1617.394841] Call Trace:[ 1617.394850] [ 1617.394864] print_trace_line+0x25e/0x570[ 1617.394878] ? ring_buffer_iter_advance+0x32/0x40[ 1617.394902] s_show+0x4c/0x160[ 1617.394919] seq_read_iter+0x2a3/0x450[ 1617.394947] seq_read+0xee/0x120[ 1617.394983] vfs_read+0xa7/0x1a0[ 1617.395006] ksys_read+0x67/0xe0[ 1617.395029] __x64_sys_read+0x1a/0x20[ 1617.395042] do_syscall_64+0x3b/0x90[ 1617.395056] entry_SYSCALL_64_after_hwframe+0x44/0xae


精華文章:【精華】Linux閱碼場原創(chuàng)精華文章匯總



閱碼場付費會員專業(yè)交流群

會員招募:各專業(yè)群會員費為88元/季度,權(quán)益包含群內(nèi)提問,線下活動8折,全年不定期群技術(shù)分享(普通用戶直播免費,分享后每次點播價為19元/次),有意加入請私信客服小月(小月微信號:linuxer2016)


專業(yè)群介紹:

彭偉林-閱碼場內(nèi)核性能與穩(wěn)定性
本群定位內(nèi)核性能與穩(wěn)定性技術(shù)交流,覆蓋云/網(wǎng)/車/機/芯領(lǐng)域資深內(nèi)核專家,由閱碼場資深講師彭偉林主持。


甄建勇-性能優(yōu)化與體系結(jié)構(gòu)

本群定位Perf、cache和CPU架構(gòu)技術(shù)交流,覆蓋云/網(wǎng)/車/機/芯領(lǐng)域資深用戶,由閱碼場資深講師甄建勇主持。


李春良-Xenomai與實時優(yōu)化

本群定位Xenomai與實時優(yōu)化技術(shù)交流,覆蓋云/網(wǎng)/車/機/芯領(lǐng)域資深用戶,由閱碼場資深講師李春良和彭偉林共同主持。


周賀賀-Tee和ARM架構(gòu)

本群定位Tee和ARM架構(gòu)技術(shù)交流,覆蓋云/網(wǎng)/車/機/芯領(lǐng)域資深用戶,由閱碼場資深講師周賀賀主持。


謝歡-Linux tracers

本群定位Linux tracers技術(shù)交流,覆蓋云/網(wǎng)/車/機/芯領(lǐng)域資深用戶,由閱碼場資深講師謝歡主持。


?

?



Linux閱碼場 專業(yè)的Linux技術(shù)社區(qū)和Linux操作系統(tǒng)學(xué)習(xí)平臺,內(nèi)容涉及Linux內(nèi)核,Linux內(nèi)存管理,Linux進程管理,Linux文件系統(tǒng)和IO,Linux性能調(diào)優(yōu),Linux設(shè)備驅(qū)動以及Linux虛擬化和云計算等各方各面.
評論
  • 一、方案簡介在Buildroot構(gòu)建的嵌入式Linux系統(tǒng)中部署Flutter應(yīng)用,主流有兩套成熟的開源方案,分別適配不同的顯示場景與開發(fā)需求:方案一:flutter-elinux(Sony開源方案)由索尼官方維護的嵌入式Linux Flutter工具鏈,既支持DRM/GBM直接渲染,也兼容Wayland、X11等多種顯示后端,場景適配性更廣。方案二:flutter-pi(輕量級嵌入器)一款輕量級Flutter引擎宿主程序,僅基于底層DRM/GBM接口實現(xiàn)渲染,無需依賴桌面環(huán)境,資源占用更低,更
    飛凌嵌入式 2026-08-07 09:34 182瀏覽
  • 做電池供電攝像頭、可視門鈴、戶外安防的同學(xué)應(yīng)該都踩過這個坑:攝像頭要拍,ISP、sensor、無線模塊全得開著,整機電流動輒幾百 mA。一節(jié) 18650 撐不了幾天,用戶投訴“怎么又沒電了”。有人會說:加個 PIR 人體紅外不就行了?問題是 PIR 怕熱、怕寵物、怕隔著亞克力/玻璃殼,而且只能感知“有溫差的人體移動”,靈敏度飄忽。真正省電的思路應(yīng)該是:讓攝像頭平時徹底睡死,只有“前面有人/有動靜”時才被一鍵喚醒——而負(fù)責(zé)這個“看門”角色的,最合適的是一顆低功耗雷達(dá)。一、為什么是雷達(dá),而不是 PI
    唯創(chuàng)知音語音芯片 2026-08-07 14:44 204瀏覽
  • 在前六期中,我們已經(jīng)分別討論了 CRA 的適用范圍、整體影響、漏洞通報義務(wù)、風(fēng)險評估與技術(shù)文檔證據(jù)鏈、第三方組件與 SBOM 供應(yīng)鏈治理,以及產(chǎn)品上市后的支持期、安全更新、用戶說明和終止支持管理。到這里,企業(yè)已經(jīng)能夠回答幾個核心問題:產(chǎn)品是否落入 CRA 適用范圍,產(chǎn)品由哪些組件構(gòu)成,企業(yè)如何證明自己在設(shè)計、開發(fā)和上市前采取了必要的安全措施,以及產(chǎn)品上市后如何持續(xù)維護和安全下線。但對于真正準(zhǔn)備落地 CRA 合規(guī)的企業(yè)來說,還有一個更現(xiàn)實的問題:CRA 的法規(guī)條文相對原則化,企業(yè)應(yīng)當(dāng)如何把“網(wǎng)絡(luò)安
    虹科云科技 2026-08-03 16:51 252224瀏覽
  • 摘要東莞市恒創(chuàng)連接器有限公司(HCHGCONN)是位于廣東東莞的連接器源頭制造工廠,專注于連接器國產(chǎn)替代、小間距大電流連接器、線對板連接器、線對線連接器、板對板連接器、電源連接器及定制連接器開發(fā)。公司面向工業(yè)自動化、新能源儲能、BMS、汽車電子、AI服務(wù)器、GPU供電、通信設(shè)備、醫(yī)療設(shè)備和智能家居等場景,提供從產(chǎn)品選型、替代評估、樣品驗證到批量交付的一站式連接方案。恒創(chuàng)可支持 Molex、TE Connectivity、JST、Hirose、Samtec 等國際品牌部分系列的國產(chǎn)替代評估。常見替
    HC003 2026-08-07 10:14 180瀏覽
  • 文:杜杰編輯:侯煜當(dāng)?shù)貢r間7月28日,美國特朗普政府落地最新科技封鎖政策,美國聯(lián)邦通信委員會(FCC)正式更新《受管制清單》,新增兩大類設(shè)備——境外生產(chǎn)的先進機器人設(shè)備、境外生產(chǎn)的聯(lián)網(wǎng)電力逆變器。FCC在官方情況說明書中明確,該類境外制造產(chǎn)品,“會對美國國家安全或美國民眾的人身安全構(gòu)成無法承受的風(fēng)險”。本次新規(guī)設(shè)置明確豁免機制:經(jīng)美國國防部(DoW)、電力逆變器品類經(jīng)美國國土安全部(DHS)審核并授予“有條件批準(zhǔn)”,認(rèn)定對應(yīng)設(shè)備品類不存在重大安全風(fēng)險,即可獲得準(zhǔn)入豁免。同時政策嚴(yán)格執(zhí)行新老劃斷原
    華爾街科技眼 2026-08-03 21:28 370瀏覽
  • 導(dǎo)語在現(xiàn)代高速數(shù)字電路設(shè)計中,信號的完整性已不僅是理想波形推演,而是一場與物理非理想特性正面博弈的工程實踐。濾波器芯片作為凈化傳輸鏈路的關(guān)鍵屏障,其核心挑戰(zhàn)在于:能否有效識別并濾除那些隱匿在電平跳變過程中的亞納秒級瞬態(tài)脈沖干擾,這類干擾持續(xù)極短,卻足以在高速鏈路中引發(fā)誤觸發(fā)。然而,傳統(tǒng)函數(shù)發(fā)生器受限于采樣率與邊沿速率,根本無法忠實復(fù)現(xiàn)如此狹窄且陡峭的異常波形。針對此困境,德思特TS-AWG7000系列任意波形發(fā)生器以17 GS/s采樣率與50 ps原生邊沿速度,為瞬態(tài)脈沖提供精細(xì)刻畫,配合SPG
    德思特測試測量 2026-08-05 14:06 5瀏覽
  • 樓宇自控里的“巴別塔”一棟智慧樓宇、一個產(chǎn)業(yè)園區(qū)里,暖通空調(diào)運行著廠商私有協(xié)議,照明系統(tǒng)遵循專屬通信標(biāo)準(zhǔn),變配電、門禁安防各成體系——設(shè)備間數(shù)據(jù)壁壘森嚴(yán),上位平臺對接全靠定制化 “翻譯” 開發(fā),不僅成本高企,交付周期也難以管控。這就是樓宇自控行業(yè)多年的痛點:協(xié)議林立、封閉林立。而破局的鑰匙,早在30多年前就已經(jīng)寫好了——BACnet。作為ASHRAE制定的樓宇自控國際標(biāo)準(zhǔn)協(xié)議,BACnet是如今全球樓宇自控系統(tǒng)(BAS)互聯(lián)互通的“通用語言”。新風(fēng)機、冷源群控、變配電、照明、門禁,凡是需要被樓宇
    飛凌嵌入式 2026-08-10 09:26 221瀏覽
  • 讓微弱脈沖信號更清晰——鎖相放大器集成Boxcar平均器在脈沖激光、泵浦-探測、時間分辨光譜、飛行時間質(zhì)譜等實驗中,真正需要測量的信號往往只出現(xiàn)在一個很短的時間窗口內(nèi),卻被淹沒在遠(yuǎn)大于它的噪聲和背景之中。 針對這類穩(wěn)定重復(fù)的微弱脈沖與瞬態(tài)信號,賽恩科儀為OE2052雙通道數(shù)字鎖相放大器帶來全新的Boxcar Averager功能升級:在鎖相檢測之外,進一步提供從周期波形觀察、門控測量到多周期平均的完整數(shù)字Boxcar測量鏈路。 Boxcar平均器,如何從噪聲中“截取”目標(biāo)信號?Boxcar平均器
    SSI_賽恩科儀 2026-08-07 15:49 18190瀏覽
  • 在物聯(lián)網(wǎng)從“萬物互聯(lián)”邁向“萬物智聯(lián)”的進程中,LTE Cat.1憑借其在速率、成本與網(wǎng)絡(luò)覆蓋之間的完美平衡,正成為中低速物聯(lián)網(wǎng)市場的絕對主力。隨著2G/3G網(wǎng)絡(luò)的逐步退網(wǎng)以及新國標(biāo)對終端設(shè)備智能化、定位功能的強制要求,Cat.1模組迎來了爆發(fā)式的增長窗口。在這一關(guān)鍵節(jié)點,基于華為海思Hi2131芯片設(shè)計的LTE Cat.1模組,憑借其在能效、射頻、架構(gòu)及物理規(guī)格上的底層創(chuàng)新,成功打破了“高性能必高功耗”的傳統(tǒng)魔咒,為行業(yè)提供了極具競爭力的連接最優(yōu)解。核心技術(shù)優(yōu)勢:重塑Cat.1能效與連接標(biāo)桿海
    用戶1778981989717 2026-08-05 21:04 206瀏覽
  • 產(chǎn)品使用18V供電,配套4串鋰離子電池,需要設(shè)計一個充電器。因為輸入18V,電池最高 16.8V,壓差僅 1.2V。因為壓差太小。使用開關(guān)型的充電控制芯片不穩(wěn)定。嘗試自行設(shè)計一個。整體采用分立三極管 + TL431架構(gòu),分4個功能單元:使能控制回路、限流環(huán)路、TL431 精密恒壓反饋環(huán)路、PNP 功率管主功率輸出回路;實現(xiàn)完整鋰電池充電邏輯。使能控制回路按鍵按下:5V 電壓經(jīng) R12 (2kΩ) 送入 NPN 管 Q3 基極,Q3 飽和導(dǎo)通,對地拉低 R1、R2 組成的分壓控制節(jié)點電位;該節(jié)點直
    southcreek 2026-08-07 13:45 494瀏覽
  •        很多人只見過封裝在SMD外殼里的小尺寸晶振,卻不知道一顆2016、1612甚至1210封裝的微型石英晶振,從一塊巴掌大的石英原礦,到最終能穩(wěn)定起振的成品,要經(jīng)過十幾道精密工序。它內(nèi)部的石英晶片厚度最薄不到20微米,比普通A4紙的1/5還薄,整個生產(chǎn)過程里哪怕0.1微米的誤差,都會直接廢掉整批產(chǎn)品,這也是小尺寸晶振過去長期依賴進口,國內(nèi)廠商花了十幾年才啃下量產(chǎn)硬骨頭的核心原因。1. 原石定向切割:0.01度的角度誤差都不能有小尺寸晶振的第一步,
    TKD泰晶科技 2026-08-07 08:43 542瀏覽
  • 做藍(lán)牙音箱的工程師大概都碰過這個局面。產(chǎn)品要連手機放歌,要本地播開機提示音和按鍵音,還要接 App 做配網(wǎng)和狀態(tài)上報。三件事拆開,早先的常規(guī)做法是音頻藍(lán)牙一顆料、數(shù)傳藍(lán)牙一顆料、本地播放再掛一顆小 MCU 加一片 Flash。板子越畫越大,BOM 越算越貴,待機電流和固件工作量也跟著漲。WT2605C 出來以后,這套需求可以集成到一顆芯片,就是 WT2605C-32N,該芯片采用QFN32 封裝,4×4 毫米,把音頻藍(lán)牙、BLE 數(shù)傳和 MP3 本地播放三樣全包了。對藍(lán)牙音箱來說,最實在的好處就
    唯創(chuàng)知音語音芯片 2026-08-06 15:14 382瀏覽
  • ?摘要:低價大流量卡正全面退市,政策收緊已成定局。面對傳統(tǒng)號卡的不確定性,隨身WiFi憑借穩(wěn)定連接、多設(shè)備共享、獨立設(shè)備和靈活套餐等優(yōu)勢,成為務(wù)實可靠的備選方案。1、流量卡黃金時代要結(jié)束了通信行業(yè)正迎來一場前所未有的“地震式”調(diào)整——曾讓無數(shù)用戶追捧的低價大流量卡,正在全速退出各大平臺。這早已不是一次普通的競合,而是一場趨勢性的行業(yè)洗牌。回望過去,19元200G的神卡,那時真是“睡著都能笑醒”,便宜到不敢相信,爽到忍不住炫耀。那些日子,好像隨便刷、隨便看,流量自由觸手可及。可如今,回頭再看,那種
    愛上電路設(shè)計 2026-08-03 10:21 128988瀏覽
  •                                                                        
    廣州鐵金剛 2026-08-06 17:44 217035瀏覽
我要評論
0
點擊右上角,分享到朋友圈 我知道啦
請使用瀏覽器分享功能 我知道啦
主站蜘蛛池模板: 《法国空乘5在线看| 裙子里面有神兽| 最新西游记| tobu8XXⅩHD| 花木兰2动画片国语| 安娜的妈妈偷看儿子手机是哪一集 | 红石坊 电视剧| 小品有钱了| 加勒比海盗女版 | 新水浒传| 爱色吧在线电影| 日本版红楼梦| 大地中文在线观看免费高清电视剧| 我的40岁大胸继拇| 动漫在线观看免费全集| 仙逆112集完整版高清4k| 动感之星小玲238集全部免费| 马达加斯加的企鹅第三季动漫| 成均馆罗曼史| 野孩子豆瓣| 打人女司机为何不构成寻衅滋事| 电视剧和平使命| 新上海滩黄晓明高清| 小姨子2电影| 等待这一天电视剧| 电视剧亲情保卫战| 使徒行者电视剧全集| 一眉道人国语高清| 心肝宝贝你突然在眼前| 漂浪青春插曲| 吞噬星空动漫免费观看完整版| 娘亲舅大| 釜山行2半岛| 滚石现场| 射雕英雄传94版粤语| 《姨母的诱惑》| 名侦探柯南713| 杰西简的电影在线播放| 蜜桃熟了的夏日| 肉蔻之香1意大利完整版| 妖精的尾巴45| 张警官三部曲在线观| 九九电视剧全集免费| 美式忌保罗讳1-4| 电视剧抗战奇侠| 《LX司令》| 进击的巨人真人版后篇| 女版战狼6三人| 刘亦菲放飞美丽mv| 插曲的痛30集全集免费观看剧情介绍欧美| 急冻奇侠完整版无删减| 《旷野之物》| 延禧攻略69集| 严础熙韩国电影| 医生手指滑进我的下身视频| 牙医姐妹郝板栗完整版| 沧元图免费全集在线观看| 3对1| 奇怪的理发店在线播放| 爱我几何完整版在线观看| 花样年华电影未删减完整版| 法国女超人无删减| 黑社会之龙城岁月| 电影美乃雀主演弟媳的电影叫什么| 新梅瓶2三A级做爰片| 美乃雀电影| 老公的朋友来做客| 牙医姐妹赤子板栗在线电影完整版播放| 火影忍者最新op| 高清观看【MIMK-023】用时间停止器来强| 搞笑一家人国语配音| 圣特罗佩姑娘们1982电影在线观看| 蝙蝠侠与罗宾| 《房屋售楼员》安姨| 国足大连备战仅不到20名记者到场| 成全动漫免费完整版高清| 《乌云之上》在线观看| 插曲的痛60集全免费播放剧情介绍 | 我可能不会爱你 全集| 优酷 火影| 宜昌保卫战电视剧全集| 电视剧金太狼的幸福生活| 狐妖小红娘电视剧真人版| 自古美女爱英雄dj| 《四大美人之貂蝉》| 鹤唳华亭电视剧免费观看| 丹麦vs塞尔维亚| ujizz在线播放| 电视剧橘子红了| 完美证据电视剧免费观看完整版| 江城子欧阳炯| 徐良小凌演唱会| 悠悠球白水| 莉娜安德森AⅤ无删减版| 永不放弃分集剧情介绍| 绿萝花电视剧免费观看| 亨利和琼在线观看| 女销售电影| 复仇者联盟bt| 侯门嫡女:谋略乾坤短剧全集| 小野兽花店| 过度保护的加穗子| 老爸待嫁| 哇嘎电影高清在线观看播放网站| 道德的火焰| kyadenkloss无码HD| 理想之城全集| (已屏蔽)| 长津湖西瓜免费播放| 王多鱼打扑克视频在线免费观看| 新荡女花妮| 爸爸我需要你的种子| 好男人电视剧免费播放完整版| 灵幻少女外传最强驱魔师vs人面犬| 黑衣人1高清| xl司令38集在线观看| 杰克逊经典歌曲mp3| 激情从| 许你半生不见短剧免费全集| 《拳击手2满天星版》| 东北风云| 综合笔记视频图片《韩剧办公室蓝色隐身帽子》 - 全集免费观看 - 永时影院印度 | 我们这一家电影| 辣椒与泡菜演员表| 午马僵尸电影全集| 危情博弈短剧免费观看| 新古惑仔之少年激斗篇国语| 侯门嫡女短剧全集| 欢乐颂共多少集| 《警中警第一部》| 斗罗大陆动画片| 真爷们儿电视剧全集| xl司令在线观看完整版动漫免费| 《我不是戏神》第一季在线观看全集| 法国风情农场| 这么多年电影在线观看 | 南京!南京!电影| 貌似高手| 真爱墨菲定律泰剧在线观看| 八戒八戒10免费观看完整版| 七夕潘甜甜牛郎织女资源| 肉蔻之香在线播放| 美人制造在线观看免费完整版| 游樣k8| 出狱脱节| 希望爸爸播种| 武林女大生| 电影《千金小姐》免费观看| 动漫在线观看免费全集| 闺蜜的朋友中字ID| 《倒插门》大结局| 致命邂逅| 电视剧双喜盈门第二部| 亢奋第一季美剧| 无限挑战 111231| 空巷子电视剧全集免费观看| 电影女儿的朋友| 陈静牺牲最大的电影| 凯登克罗斯电影在线| 《芬芳喜事》今日开播| 公与浮之| 您好母亲大人| 插曲的痛全集免费观看高清版| 电视剧神隐在线播放最新| 美女在线观看免费高清电视剧奔跑吧ep | 珠江人家电视剧免费观看| 电影《越南妹》99号叫什么名字| 人体蜈蚣1电影| 号手就位电视剧免费观看| 少年包青天2| 三姐妹请家政免费播放| 春闺梦里人电视剧| 曼谷花魁| 新电视剧推荐| 三姐妹电影| 正在播放: 解决学生的性爱烦恼不穿内衣裤的美波老师硬硬教学 _美波汐里 - 91n | 听说我老婆是反派大佬| 未知| 锦鲤少女:旺夫旺家旺全族全集免费 | 永远的第一名番外| 高清《诱人的护士》日本在线观看| 曹云金官场斗| 李宇春 新专辑| 双子星公主第3部| D罩杯的保险销售在线观看 | 桃色凶器免费观看| 了不起的女孩电视剧| 隐形的帽子| 观音坐莲电影普通话版免费观看| 告密者在线观看完整版电影| 第一集就开车的动画片| 电影廊桥遗梦| 巜人妻私密按摩师2| 东莞东坑新东泰| 徐少强版《金悔瓶》演员阵容| 杀死比尔1完整版电影| 水电维修工的艳遇电影 | 流水沼沼电视剧免费观看完整版| 恶作剧之吻日版2013| 《妈妈爱上儿子同学》全集在线看 | 武装特警| :《Le Trou》(2019)| 余味毛豆豆| 法国空姐4免费高清原声我奔跑| 风雨木林| 鹰隼大队| 黄金圣斗士| 三个和尚| 一路向西迅雷种子| 枭起青壤在线免费观看| 漂亮的瘦子 4| 天底良知电视剧完整版免费| 《莫莉特别的酒店》免费观看| 夫妻免费看大片真人电视剧 | 神州侠侣高清| 国家地理频道| 锵锵锵锵锵锵锵锵电视剧免费观| 女老大电影免费观看完整版| 双人调情按摩术在线看| 重口味英剧| 韩国少妇厨房激情做爰| 韩国美人在线观看| 夜行神龙| 日本金银1-5普通话| 勇者王粤语| 《乳房按摩》免费观| 爱我几何,免费| 朱迅的葬礼现场照片| 天师钟馗之红梅阁| 庆余年2首支预告| 高清《情事》2014韩国在线观看| 小炸jackson| 双人调情按摩伦理片| 韩国电影免费观看高清完整版在线| 空蝉之森酒法子完整版| 影帝合约:变真爱短剧全集| 爱的发声练习结局| 林正英国语全集| 你微笑时很美全集电视剧免费观看| 飚车电影| 玉米电影| 丧服未亡人被义子侵犯| 非诚勿扰 2号| 灭火宝贝2斯托雅| 我的家庭女教师| 地下交通站第三部| 高清年少有为| 公交车被cao得合不拢腿| 幻想1998罗丽星克莱尔| 性情中人中文网bt| 中国三年免费下载观看| 韩剧四十九天| 底线电视剧在线观看完整版免费| 侠岚第3季全集| 光能使者国语版全集| 非你莫属| 牙医姐妹电影在线完整免费观看1986| 独一无二在线观看完整版| 在线观看免费版高清短剧| 异蟒狂袭| 闽清县| 丫丫落地时现场接机群众欢呼| 黎明前的抉择免费观看| 菠萝菠萝蜜在线观看一区| 龙年手抄报简单又好看| 《《替夫还债3》HD中字》电影-高清完整版在线观看-JJ影院 | 堕入地狱在线观看| 花花公主| 兔子先生在线观看高清完整版免费 | 做aj的视频大全电视剧试看| 女子拒绝同事表白后遭辱骂| 王府小丫鬟短剧全集| 恨锁金瓶电影| 翁止熄痒禁伦短文合集免费视频| 需要爸爸的种子电影在线观看的| 圆桌派最新一季2024| 酒店服务生满天星法版免费观看星辰影院 | 有效期限爱上你全集| 漂亮妹妹在线观看免费高清电视剧| 农场主的三个女儿| 《红杏出墙记》| 继拇献身义子3| 真人cs装备厂家| 恶少的毒爱| 醉酒的玫瑰高清在线观看| 西出玉门几点更新| 初体验5正版| 八尺夫人完整版高清免费| 三狼奇案| 人民的名义55集在线播放| 王保长新篇电视剧| 和最讨厌的部长一起去出差旅 | 满天星HD版女超人在线 | 釜山行西瓜影音| 《女律师替夫还债》剧情介绍曹查理| 他是谁免费观看| 开心女鬼国语| 漂亮的妈妈7中字开头7个字!| 死神来了5免费观看完整版| 凯登克罗斯在线免费观看| 长津湖战役3免费观看| 家有一老 电视剧| 狮子王2| 醉后决定爱上你| 法国少女农场高清在线看中文 | 泉州天宫酒吧| 美国版荷尔蒙15| 没有怜悯的世界免费高清观看| 古墓丽影满天星版免费播放| 名侦探柯南:独眼的残像| 唐人街探案3正片免费观看 | 恋空 电影| 漂亮小瘦子3| 狼群在线观看中文| 开始推理吧免费观看完整版| 初体验在线观看| 天堂的张望 电影| 私人女性监狱电视剧完整版观看免费 | 杨玉环电视剧| 正在播放: JUL-975 没有我丈夫的五天,我被命令禁欲到第一个晚上,我的性岳父对 | 图书馆的女友(日漫)第五集| 玉璞团之鉴宝2高清| 甄嬛传电影版| 百家讲坛 刘伯温| 山医命相卜| 维修师傅的艳遇电影| 动漫城市猎人国语版| 乡村里的中国 纪录片| 闪光夫妇全集高清| 战神归来| 3d柔铺团| 马成的喜悦| 勿扰警告| 2010《暮光同城》双男主| 电影偷窥无罪| 中国好声音第四季冠军| 鹿鼎记黄晓明版粤语| 一泊二日| 莫妮卡大度电影免费观看爱我几何 | 十七岁高清在线播放免费| 刘亦菲素颜逛服装店| 性解密日韩女| 红唇原唱完整版| 女技师| 热情邻居电影免费播放全集在线看| 狼狈电影完整版| 酒店1-100集免费看全集下载| 权游前传龙族第二季| 凤翔县| 背后的故事新还珠格格下| 国民奇探| 美容院·特珠待遇6| 孟晚舟为什么被捕| 城中之城电视剧全集免费| 厨房激情3日本| 杨贵妃免费观看| 男女一起愁愁愁| 新版射雕英雄传2024| 港汇跳楼| 《偿还2》免费观看完整版| 功夫熊猫2电影| 张开印ko蓝桑坤| 桔子mv在线观看免费| 电视剧樱桃| 战狼6在线观看下载| 哈尔滨爆炸事故初查系人为 | 请问护士俄剧满天星| 高清《求佛》po| 免费韩剧| 满仓进城免费观看全集完整版| 情感战争电视剧全集| 美容店的待遇电影| 我邻居的老婆 电影| 高清《你的名字》高清免费观看| 坎贝奇无憾人生免费| 踏血寻梅电影完整观看| 《被可怕的科长欺负的新人| 灵魂摆渡人第三季| 伊波拉病毒2伊波拉大逃亡| 乡村爱情3剧情| 电视剧再爱我一次| 兄弟换麦子6国语版免费| 童话村手机在线观| 高清《妻子6》在线观看 | 命运 电视剧| 欧美年轻的继拇3| 刑警2010国语| 美人鱼的动画片| 雍正王朝电视连续剧| 陈冠希艳照门bt| 老公的上司来家里韩国电影| 百日的郎君| 泰罗奥特曼第一集| 激战后厨第1-6集在线播放| 《卡戴珊家族 第七季》| 加勒比海盗女版1完整版免费| 大江大河3免费观看全集电视剧| 漂亮的姨母5韩国| 壮志凌云美版满天星| 索多玛的120天在线观看| 九条的大罪未删减| 17·3在线观看免费| 理论片午午伦夜理片影院| 法国娃娃脸4| 梦寻桃花源免费观看| 道德的火焰| 电影《塔日酒店》在线观看| 青春环游记综艺| 人间中毒在线观看完整版爱| tube 8| 闪亮的西瓜电视剧免费观看| 战狼6免费高清版999加拿大版| 化妆师坐张艺凡腿上补妆| 哪里可以看天与地| 《爱我几何》电影免费| 一人之下第六季在线观看| 《陷入我们的热恋》电视剧| 白峰美羽教师的心酸在线观看| 暗夜与黎明免费播放| 堡垒电影| 白晶晶电影全集免费看| 少妇的诱惑电影观看| 花名未闻剧场版| 年经母年经1的中文| 淬火年代电视剧免费观看完整版| 《卖房子的女销售》 | 美国电影《爸爸播种》豆瓣| 乡村爱情第8部| 长津湖国语免费观看| 王伦宝男男视频| 飙速宅男第四季| 军训跳舞吊带| 五十度黑128分未删减版| 爸爸去哪儿第四季| 黑白配国语高清在线| 青春有你第一季| 让爱回家| 水手服饰育完整版| 美国刺客| 火蝴蝶第二部| 82板杨敏思版本1-5电视剧免费观看就是 | 一起愁愁愁免费全集| 可恶的新娘| 朋友的母亲ID中字谜| 少女与动物高清免费观看| 密爱电影免费完整版在线观看| 电影激战丛林| 烈火青春19| 长相思第一季多少集| 人世间 纪录片| 超级经纪人在线观看| 和女部长一起去公司研学日剧叫什么 | 柯南国语爱奇艺| 东边日出西边雨电视剧| 莫莉特别酒店4| 聊斋艳谭2| 权力的游戏第一季未删减| 千斤肉板栗免费观看| 周星驰《食神》| 福贵免费在线观看| 《妻子6》在线观看免费版电视剧| 《三十而已》电视剧| 要过好日子全集| 潘多拉之镜1983满天星版资源| 唐顿庄园2| 火影忍者全集土豆网| 《渔夫荒淫史在线播放| 师门大反派短剧免费观看| 快乐至死| 爱在几何完整版| 狩猎季节| 庆余年电视剧免费观看完整版| 韩剧美容院特殊待遇| 爹别苟了出山吧 你真无敌了| 哈利波特| 继母麦乐迪马克思| 我是乡巴佬| 趟过女人河的男人全集| 女销售员的秘密 在线| 再见龙生你好人生| 敌人英语| 台剧黛比| 地米菜煮鸡蛋的功效与作用| 捡漏小能手:古玩街我称王短剧全集| 精舞门陈小春电影| 一仆二主电视剧 全集| 美容院3:特殊待遇| 爱情睡醒了40集| 万家灯火养生2013| 美国娃娃脸4(经典版)| 白雪公主 韩剧| 边水往事连续剧免费观看全部 | 良陈美锦电视剧在线观看| 国产动漫| 蓬安县| 西部世界在线观看| 韩剧婚礼国语版全集| 《金牌销售》全集| 为爱坚守电视剧全集免费观看 | 窈窕淑女在线观看免费完整版| 帝王计划怪兽遗产电视剧免费观看| 正蓝旗| 不许抢劫| 丰满的妽妽3韩国电影| 铁根游戏解说| 养父 电视剧| 陪讨厌部长去出差旅视频| 间谍过家家动画在线观看免费版7| 姜子牙电影| 电影《急诊护士》| 美女姐姐我爱你| 走火40集全免费观看| 360大佬爱上我第二季全集观看| 整容天后完整版视频| 聊斋画皮全集| 韩国三位少妇按摩| 季雨倾城未删减| 你是我的荣耀32集免费观看| 突出重围电视剧| 女飞行员(美国)满天星女版| 谍影重重1电影| 聊斋之流光情劫电影免费观看| X L司令| 《淘气的女孩也需要爱》| 浑身是劲2011| 日剧《家庭教师上门拜访》 | 韩国电影 绿椅子| 欲女聊斋| 电影《1993》米莉亚姆| 晚上睡不着看的免费| 逃学威龙| 花与蛇4牙医诊所全集| 荆轲刺秦王电影| 绽放电视剧全集免费观看| 需要爸爸来播种在线观看| 小小安妮第三季| 福禄寿电影粤语| 销售的秘密2| 新金瓶梅第一集| 末日村庄电影完整在线观看 | 谁和她睡了百度影音| 《偷香》未删减在线观看| 大侦探9免费观看| 致命弯道4高清全集| 玉女心经 舒淇| 日历女孩在线版完整免费观看中文| 琉璃电视剧在线观看免费全集| 血战墓碑镇| 韩国电影美容店的特别待遇| 蔡妍 两个人 mv| 四平青年之风云再起| 轻漂亮的 子4| 三月女郎| 我知道我爱你免费观看| 芬兰空姐4| 追风行动电视剧全集免费观看| 法国空姐完整版剧情HD| 向风而行免费观看全集| 女子户卫队,满天星| 高清《我的狐仙女友》| 师傅在首尔| 《十七种幻想》电影在线观看| 折腰电视剧剧情| 加油亚当君| 荷尔蒙6欧美版哪里看| 日本巜侵犯人妻人伦| 来跳舞吧| 法国少女3| 高清《科学家们》动漫免费观看| 朋友的姐姐线观高清3中语| 《女警坠落2》在线观看| 自由的她们纪录片免费观看| 女神宿舍的宿官君| 盐边县| 启示电影在线观看完整版| 教授和他的女大学生| 迈克尔 道格拉斯| 1986《牙医姐妹》在线看| 爱即所求电影| 快乐再出发综艺| 越南战争片满天星| 教练把我压在方向盘上| 七龙珠在线| 《二对一的商务模式2》| 伊甸园 韩国综艺| 芈月传电视剧全集下载| 大秦帝国在线| 凯帕克的电影大全免费观看| 儿媳妇的| 年轻的母亲4在线看完整版| 国产在线观看免费版电视剧 | 全职法师第6季全集免费观看| 小泽彻主演的《老板老板的要求》电影播放| 《官人我要房》电影| 金瓶双艳HD完整版| 南洋十大邪术 电影| 白衣绳索牙医免费高清观看| 奥巴马白宫记者晚宴| 电视剧西施秘史全集| 甜蜜罚罪无打马赛全集| 黑太阳南京大屠杀 1995 张良| 疯狂的萝莉训练| 部长出差的日子免费观看| 追我魂魄| 高清《千与千寻》普通话版| 西游记恶搞配音| 成人在线播放网站导航| 电视剧温柔的背后在线观看| 文安县| 白峰电影在线观看在线| 日本电影少女免费观看电影大全| 四位大学位按摩记电子版pdf百度网盘| 愉悦与苦痛下载| 蛇王2021| 特殊的滋味在线观看视频| 尖叫之夜免费观看2023年电影| 花仙子动画片全集| 温泉艳遇| 随唐演义 全集高清| 火凤凰33集| 卖房子的女销售中文字幕未删减完整版在线免费观看 | 97年电影在线免费观看| 僵尸再翻生| 回春医疗保健66下载| 折腰电视剧全集高清免费观看| 肉蔻之香无删减版在线观看完整版 | 麻雀变公主| 美容院特殊的待遇5| 魔力宝贝监狱 完整版在线观看| 聪明的一休国语版免费观看| 总统夫人星克莱尔在线观看| 岁岁年年柿柿红免费观看全集 | 西藏| 连续7天失去理智的日剧是第几集 战狼12欧美版免费观看完整版国语百度 | 美国蜜桃在线| 《隋唐英雄传》| 北京教父2| 电影安斋拉拉中文字幕| 刀客家族的女人19| 台湾骂人的话| 无颜之月免费观看完整| 三年大片高清观看完整版| 动漫《毛利兰的小玩具》在线观看| 随唐英雄第四部| 富民县| 满天星家庭矛盾无删减版| 盖世帝尊动漫在线观看完整版免费 | 中餐吃什么好| 恋之欲室百度影音| 青青河边草观看| 《千金赤子板栗》完整版免费| 我在情人截取了一段小视频| 播放女流氓完整版电影| 战狼6全片免费入口| 星空影视论语《部长出差的日子》| 亲吻姐姐第1季全集| 前嶋美纪| 丈夫的上司| 亲爱的老师免费观看完整版高清| 纯白交响曲动漫免费观看| 墨西哥10.5级地震| 哇嘎高清电影在线播放 | 大叔我爱你电影| 无憾坎贝奇无删减版在线| 妈妈我想你歌曲原唱| 陆贞传奇52集| 《禁忌4》未删减版| 女侓师的坠落| 2012在线播放| 间谍过家家第三季免费观看| 豆芽菜的爱广场舞| 男按摩师做乳房电影| 拆弹专家| 雷速登闪电冲线第3部全集| 意大利电影《八尺夫人》完整版| 女性按摩店HD| 张雪峰建议大学举行入学考| 妈妈压上傻儿子大结局是什么 | 樱桃电影| 一起来看流星雨4| 《昭和系列》电影全部导演| 回复术士的重启人生4集在线观看| 冷宫娘娘有喜啦| 神马电影男神马电影| id002经典热门电视剧在线观看| 可是我永远记得| 我是警察电视剧| xl司令免费全集观看| 斗罗大陆第196集免费观看| 绣春刀1| 机器鸡星球大战3| 渔夫荒淫史在线| 多功能老婆| 南京撞人| 【JUL-975(中字)老公不在家5日间 身心被性豪公公彻底调教 水川堇#鬼父】https | 美景之屋2在线观看高清未删减| 艾曼纽3原版满天星| 成熟玫瑰| 大岛优子快播| 告白动漫剧在线播放| 在线播放天海翼| 芭蕾舞剧金瓶梅| 幸福小丈夫全集| 延禧攻略电视剧全集免费观看| 美国女儿借爸爸种菜是哪一集| 神兽金刚动画片全集| 《千古玦尘》电视剧| 《禁忌之恋》大结局| 《插曲的痛免费观看》中文版| 黑道风云电视剧全集| 倾城之泪百度影音| 蜈蚣咒未删减版完整版恐怖电影| 大江大河3第53集免费观看| 中国海军击溃海盗| 女子在足浴店被技师弄晕| 耒阳市| 荣耀守则 在线| 铎字怎么读| 恭喜发财短剧免费观看| 梦鸽原名| 电影小兵张嘎免费观看| 毒液3免费观看完整版高清中文版| 三位大学位按摩记角色分析及角色分 | 白月梵星花絮| 《爱我几何》原版免费观看未删减在 | 我要成为世界最强| 冯巩个人简历简介| 右玉在线| HD版泰山《激战丛林》完整版在线观看| 电影《牙医姊妹》在线播放 | 八尺夫人正版免费观看| 九五之尊电视剧粤语| 假日暖洋洋电视剧在线观看免费| 愁愁愁电视剧免费观看 | 守望爱情| 电影《女子护卫队》在线观看免费| 《色 戒》在线观看| 伤不起的简谱| 和喜玉兰免费观看全集播放| 小熊一族动漫| 电视剧《仁心俱乐部》完整版| 超脑48小时| 美版武则天最惊艳的版本| 汤方大胆人体艺术| 电视剧热爱| 《丰满的继牳2》| 大男孩电影| 何赛飞获金鸡奖最佳女主角| 吻别英文版叫什么| 法国空姐4在线观看| 丹麦vs塞尔维亚| 暗香 电视剧| 高清《雏菊》| 野外强伦轩女教师HD| 白日梦我电视剧免费观看完整版| 花样男子国语版高清| 女邻居请邻居修灯泡修灯是什么剧 | 永顺县| 木下凛凛电影免费观看| 谭晶 我是歌手| 传说中的七公主全集| 需要爸爸的种子| 跟部长出差电影| 乳品分类| 黑人巨大两根一起挤进的视频| 印度空姐2全集观看完整版| 旧版包青天| 《朋友夫妇:交换》3| 无所畏惧2正版免费播放| 宝莲灯免费| 影视剧难以接受的结局| 《美国灭火宝贝2》导演是谁| 3d肉蒲团 蓝燕| 我为卿 狂| 樱桃电影在线免费观看| 沧元图第二季59集完整版| 杰克逊拯救地球| KKKBO| 隋唐英雄传三| 大唐情史| 电影《牙医姊妹》免费| 灰姑娘电影| 今夜无人入睡免费观看第一集 | 机械画皮| 《性/生活4》免费观看| 失魂客栈| 康体水疗完整版在线观看免费播放| 终极一班3mp4下载| 陈小春版鹿鼎记免费| omoflow第一集真人 | 善良的医生在线观看| 在异世界迷宫开宫| 欢乐家长群2 电视剧| 波多野结衣死了没| 电影赤壁| 荒岛女特工满天星免费观看| 西瓜在线| 命中注定我爱你20| 七龙珠z剧场版| 日剧《和讨厌的前任》中字| 核子航母遇险记| 前任攻略4| 美国灭火宝贝完整版| 薛丁山演员表全部| 2008徐少强在线观看完整版 | 电影卖春| 男女一起愁愁愁免费全集高清电视剧| 姐姐的朋友4在完整4视频带翻译| 逐玉电视剧| 高清《古村女人》电视剧| 男女一起愁愁愁高清全集在线看| 激战厨房1-5集全免费播放最新一期| 拯救大兵瑞恩免费| 名侦探柯南16 第11个前锋| 珍妮动画全集免费| 邵氏《女儿国》满天星| 屋塔房王世子国语| 有关黄河的诗歌| 龙摄天下土耳其摄影作品| 插曲的痛第60集免费看| 薄冰谍战电视剧全集免费播放| 师娘她甜爆全师门短剧免费观看| 重案六组第四部全集| 入室女职工被强行糟蹋| 伯爵满天星在线观看| 宸汐缘电视剧免费观看全集| 血腥的夜晚| 正负之间电视剧在线观看完整版| 电影千金赤子板栗免费观看| 好看的美国爱情片| 侏罗纪公园1在线观看免费完整版| 哈儿传奇剧情| 溜溜影视| 爱的阶梯全集| 1996年杨敏思版电视剧第三回合| xl司令全集观看完整版| 九五至尊电视剧| 斗罗大陆唐门英雄传| 尸家重地 国语| 电影《千金与仆人》免费播放| 巡回检察组完整版免费观看| 冰雪尖刀连免费观看| 闪婚大佬后免费全集在线观看| 重庆暴雨祖孙三遇难| 漂亮妈妈6巴字中字开头7个字| 种其因者须食其果短剧大结局| 美女泳装跳舞钢管舞| 你给老子不上班| xl司令在线观看完整版动漫第一季| 女超人无删减版| 三哥田螺|