国产亚洲精品福利在线无卡一,国产精久久一区二区三区,亚洲精品无码国模,精品久久久久久无码专区不卡

當(dāng)前位置: 首頁 > news >正文

網(wǎng)站ui設(shè)計要點(diǎn)百度平臺營銷

網(wǎng)站ui設(shè)計要點(diǎn),百度平臺營銷,產(chǎn)品的網(wǎng)絡(luò)推廣要點(diǎn),網(wǎng)站開發(fā)杭州簡介 uprobe是一種用戶空間探針,允許在用戶空間程序中動態(tài)插樁,插樁位置包括: 函數(shù)入口 特定偏移處 函數(shù)出口 當(dāng)我們定義uprobe時,內(nèi)核會在附加的指令上創(chuàng)建快速斷點(diǎn)指令(X86機(jī)器位int3指令)&#xff…

簡介

uprobe是一種用戶空間探針,允許在用戶空間程序中動態(tài)插樁,插樁位置包括:

  • 函數(shù)入口

  • 特定偏移處

  • 函數(shù)出口

當(dāng)我們定義uprobe時,內(nèi)核會在附加的指令上創(chuàng)建快速斷點(diǎn)指令(X86機(jī)器位int3指令),當(dāng)程序執(zhí)行到該指令時,內(nèi)核將觸發(fā)時間,程序陷入內(nèi)核態(tài),并以回調(diào)函數(shù)的方式調(diào)用探針函數(shù),執(zhí)行完探針函數(shù)再返回到用戶態(tài)繼續(xù)執(zhí)行后續(xù)代碼。

uprobe基于文件,當(dāng)一個二進(jìn)制文件中的一個函數(shù)被跟蹤時,所有使用到這個文件的進(jìn)程都會被插樁,包括那些尚未啟動的進(jìn)程,這樣就可以在全系統(tǒng)范圍內(nèi)跟蹤系統(tǒng)調(diào)用。

libbpf uprobe相關(guān)函數(shù)

bpf_program__attach_uprobe

該函數(shù)可以將BPF程序附加到通過二進(jìn)制路徑和偏移量找到的用戶空間函數(shù)中。可以選擇指定要附加的特定進(jìn)程,還可以選擇將程序附加到函數(shù)出口或入口。

原型:

struct bpf_link *bpf_program__attach_uprobe(const struct bpf_program *prog,bool retprobe,pid_t pid,const char *binary_path,size_t func_offset);

參數(shù):

  • prog:要附加的BPF程序

  • retprobe:附加到函數(shù)出口

  • pid:附加uprobe的進(jìn)程ID(0表示自身進(jìn)程,-1表示所有進(jìn)程)

  • binary_path:包含函數(shù)符號的二進(jìn)制文件的路徑

  • func_offset:函數(shù)符號二進(jìn)制內(nèi)的偏移量

返回值:

  • 新創(chuàng)建的BPF鏈接引用

  • 出錯時返回NULL,錯誤代碼存儲在errno中

bpf_program__attach_uprobe_opts

該函數(shù)與上一個函數(shù)類似,只是具有用于各種配置的選項(xiàng)結(jié)構(gòu)。

原型:

struct bpf_link *bpf_program__attach_uprobe_opts(const struct bpf_program *prog,pid_t pid,const char *binary_path,size_t func_offset,const struct bpf_uprobe_opts *opts);

參數(shù):

  • prog:要附加的BPF程序

  • pid:附加uprobe的進(jìn)程ID(0表示自身進(jìn)程,-1表示所有進(jìn)程)

  • binary_path:包含函數(shù)符號的二進(jìn)制文件的路徑

  • func_offset:函數(shù)符號二進(jìn)制內(nèi)的偏移量

  • opts:更改程序附件的選項(xiàng)

返回值:

  • 新創(chuàng)建的BPF鏈接引用

  • 出錯時返回NULL,錯誤代碼存儲在errno中

bpf_program__attach_usdt

該函數(shù)與上一個函數(shù)類似,只不過它覆蓋了USDT(用戶空間靜態(tài)定義跟蹤點(diǎn))附件,而不是附加到用戶控件函數(shù)入口和出口。

原型:

struct bpf_link *bpf_program__attach_usdt(const struct bpf_program *prog,pid_t pid,const char *binary_path,const char *usdt_provider,const char *usdt_name,const struct bpf_uprobe_opts *opts);

參數(shù):

  • prog:要附加的BPF程序

  • pid:附加uprobe的進(jìn)程ID(0表示自身進(jìn)程,-1表示所有進(jìn)程)

  • binary_path:包含函數(shù)符號的二進(jìn)制文件的路徑

  • usdt_provider:USDT提供商名稱

  • usdt_name:USDT探針名稱

  • opts:更改程序附件的選項(xiàng)

返回值:

  • 新創(chuàng)建的BPF鏈接引用

  • 出錯時返回NULL,錯誤代碼存儲在errno中

實(shí)踐

準(zhǔn)備被打樁的用戶程序

用戶程序源碼

編寫一個簡單的程序,循環(huán)調(diào)用test_addtest_sub函數(shù)。

/* src/other/main.c */
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>int test_add(int a, int b)
{return a + b;
}int test_sub(int a, int b)
{return a - b;
}int main(int argc, char *argv[])
{int a = 0, b = 1;for (;;a += 1, b += 1) {printf("test_add(%d, %d) = %d\n", a, b, test_add(a, b));sleep(1);printf("test_sub(%d, %d) = %d\n", a, b, test_sub(a, b));sleep(1);}return 0;
}

編譯

在編譯用戶程序時,必須加上-g -dynamic參數(shù),確保二進(jìn)制文件中包含了所有調(diào)試信息和符號信息,BPF程序需要通過這些信息進(jìn)行打樁,否則不能正常打樁。

查看符號函數(shù)

objdump -T build/other | grep test_add00000000004011a0 g    DF .text	0000000000000004  Base        test_addobjdump -T build/other | grep test_sub00000000004011b0 g    DF .text	0000000000000005  Base        test_sub

命令最后輸出的符號test_addtest_sub便是我們需要打樁的符號名稱。

重要:某些情況下函數(shù)名稱和符號表中的名稱可能不一致,在后續(xù)BPF打樁時,需要使用符號表中函數(shù)名稱。

uprobe ebpf程序

內(nèi)核程序

在內(nèi)核中我們使用SEC宏定義要打樁的函數(shù),使用BPF_KPROBE宏定義函數(shù)探針函數(shù)。

SEC有兩種模式:

  • 指定要捕獲的二進(jìn)制文件路徑和要捕獲的函數(shù)符號名,在用戶程序中只需要使用xxx_bpf__attach(skel)即可

  • 不指定要捕獲的二進(jìn)制文件路徑和要捕獲的函數(shù)符號名,用戶程序中則需要使用bpf_program__attach_uprobe進(jìn)行指定參數(shù)附加

BPF_KPROBE定義探針函數(shù),需要注意每個函數(shù)名需要不同。

/* src/kernle/main.bpf.c */
#include "kernel/bpf_kernel.h"char LICENSE[] SEC("license") = "GPL";/*** 在 SEC 宏中指定了要捕獲的二進(jìn)制文件路徑和要捕獲的函數(shù)符號名,* 則在用戶程序中只需要使用xxx_bpf__attach(skel)即可*/
SEC("uprobe//root/project/bpf_user_core/build/other:test_add")
int BPF_KPROBE(test_add, int a, int b)
{/* 捕獲 test_add 入口 */bpf_printk("test_add entry: a = %d b = %d\n", a, b);return 0;
}SEC("uretprobe//root/project/bpf_user_core/build/other:test_add")
int BPF_KRETPROBE(ret_test_add, int ret)    /* 這里的函數(shù)名不能更入口點(diǎn)的函數(shù)名相同 */
{/* 捕獲 test_add 出口 */bpf_printk("test_add exit: return = %d\n", ret);return 0;
}/*** 沒有在 SEC 宏中指定二進(jìn)制路徑和函數(shù)名稱時,* 在用戶程序中則需要使用bpf_program__attach_uprobe進(jìn)行指定參數(shù)附加*/
SEC("uprobe")
int BPF_KPROBE(test_sub, int a, int b)
{/* 捕獲 test_sub 入口 */bpf_printk("test_sub entry: a = %d b = %d\n", a, b);return 0;
}SEC("uretprobe")
int BPF_KRETPROBE(ret_test_sub, int ret)
{/* 捕獲 test_sub 出口 */bpf_printk("test_sub exit: return = %d\n", ret);return 0;
}

用戶程序

在用戶程序中,使用bpf_program__attach_uprobe_optsbpf_program__attach_uprobe加載探針程序

/* src/user/load_bpf.c */#include <stdio.h>#include "user/load_bpf.h"
#include "user/parse_arg.h"static int libbpf_print_fn(enum libbpf_print_level level, const char *format, va_list args)
{/* 完成調(diào)式信息控制 */if (!user_args.debug_log) {return 0;}return vfprintf(stderr, format, args);
}struct kernel_bpf *load_bpf_to_kernel(void)
{struct kernel_bpf *skel;int err;LIBBPF_OPTS(bpf_uprobe_opts, uprobe_opts);libbpf_set_print(libbpf_print_fn);skel = kernel_bpf__open();if (!skel) {fprintf(stderr, "Failed to open and load BPF skeleton\n");return NULL;}err = kernel_bpf__load(skel);if (err) {fprintf(stderr, "Failed to load and verify BPF skeleton\n");kernel_bpf__destroy(skel);return NULL;}/* 進(jìn)行 uprobe 插樁 *//* 插樁入口點(diǎn) */uprobe_opts.func_name = "test_sub";uprobe_opts.retprobe = false;skel->links.test_sub = bpf_program__attach_uprobe_opts(skel->progs.test_sub,-1, /* 所有進(jìn)程 */"/root/project/bpf_user_core/build/other",0,&uprobe_opts);if (!skel->links.test_sub) {err = -errno;fprintf(stderr, "Failed to attach uprobe: %d\n", err);kernel_bpf__destroy(skel);return NULL;}/* 插樁出口點(diǎn) */uprobe_opts.func_name = "test_sub";uprobe_opts.retprobe = true;skel->links.ret_test_sub = bpf_program__attach_uprobe_opts(skel->progs.ret_test_sub,-1, /* 所有進(jìn)程 */"/root/project/bpf_user_core/build/other",0,&uprobe_opts);if (!skel->links.ret_test_sub) {err = -errno;fprintf(stderr, "Failed to attach uprobe: %d\n", err);kernel_bpf__destroy(skel);return NULL;}err = kernel_bpf__attach(skel);if (err) {fprintf(stderr, "Failed to attach BPF skeleton\n");kernel_bpf__destroy(skel);return NULL;}return skel;
}

獲取代碼

git clone https://github.com/zhutouwangzha/eBPF.git

編譯

cd 002-ebpf-uprobe && make

運(yùn)行

# 運(yùn)行自定義用戶程序,循環(huán)調(diào)用test_add,test_sub
./build/other# 加載BPF程序
./build/user# 查看BPF程序輸出
sudo cat /sys/kernel/debug/tracing/trace_pipe

成功執(zhí)行后,能看到如下輸出:

           other-4815    [004] ....1  6587.022754: bpf_trace_printk: test_add entry: a = 2 b = 3other-4815    [004] ....1  6587.022828: bpf_trace_printk: test_add exit: return = 5other-4815    [004] ....1  6588.023139: bpf_trace_printk: test_sub entry: a = 2 b = 3other-4815    [004] ....1  6588.023197: bpf_trace_printk: test_sub exit: return = -1other-4815    [004] ....1  6589.023385: bpf_trace_printk: test_add entry: a = 3 b = 4other-4815    [004] ....1  6589.023437: bpf_trace_printk: test_add exit: return = 7other-4815    [004] ....1  6590.023772: bpf_trace_printk: test_sub entry: a = 3 b = 4other-4815    [004] ....1  6590.023834: bpf_trace_printk: test_sub exit: return = -1

http://aloenet.com.cn/news/28491.html

相關(guān)文章:

  • 上海市建設(shè)安裝協(xié)會網(wǎng)站如何在百度發(fā)布廣告信息
  • logo智能設(shè)計一鍵生成器無憂seo博客
  • 西安電腦網(wǎng)站建設(shè)aso推廣平臺
  • 對網(wǎng)站設(shè)計的建議網(wǎng)絡(luò)推廣渠道和方式
  • 懷化做網(wǎng)站的公司怎么做關(guān)鍵詞排名靠前
  • 模擬網(wǎng)站建設(shè)對網(wǎng)絡(luò)營銷的認(rèn)識
  • 網(wǎng)站url改版線下營銷方式主要有哪些
  • 做那種網(wǎng)站賺錢廣州代運(yùn)營公司有哪些
  • 做視頻網(wǎng)站 視頻放在哪里西安網(wǎng)頁設(shè)計
  • 不準(zhǔn)別人網(wǎng)站做反鏈好網(wǎng)站制作公司
  • 織夢網(wǎng)站如何做地區(qū)分站青島seo整站優(yōu)化招商電話
  • 重慶網(wǎng)站建設(shè)哪個公司好百度關(guān)鍵詞搜索量
  • wordpress模板用法深圳百度網(wǎng)站排名優(yōu)化
  • h5如何做多頁面網(wǎng)站愛站查詢
  • 網(wǎng)頁設(shè)計技能證書怎么考寧波如何做抖音seo搜索優(yōu)化
  • 做網(wǎng)站需要學(xué)那幾個軟件whois查詢 站長工具
  • 蘭溪做網(wǎng)站seo優(yōu)化工作內(nèi)容做什么
  • 品牌宣傳型網(wǎng)站構(gòu)成營銷策劃與運(yùn)營公司
  • 網(wǎng)站開發(fā)有沒有前途12345微信公眾號
  • 站長統(tǒng)計向日葵app下載百度推廣投訴熱線
  • 東莞網(wǎng)站建設(shè)公司中國企業(yè)500強(qiáng)
  • 購物網(wǎng)站制作流程關(guān)鍵詞查找
  • 打開網(wǎng)頁時網(wǎng)站頂部顯示廣告隨后消失的廣告怎么做seo專員崗位要求
  • 整站優(yōu)化方案網(wǎng)站優(yōu)化技巧
  • 園區(qū)門戶網(wǎng)站建設(shè)方案大型網(wǎng)站seo課程
  • app那個網(wǎng)站開發(fā)比較好內(nèi)部搜索引擎優(yōu)化
  • 網(wǎng)站可以叫做系統(tǒng)嗎企業(yè)培訓(xùn)課程
  • 蘇州公司網(wǎng)站seo外鏈推廣員
  • 空間鏈接制作網(wǎng)站百度推廣中心
  • 軟件測試培訓(xùn)一般多少錢長春seo排名優(yōu)化