第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何使用 ebpf 獲取 goroutine id

如何使用 ebpf 獲取 goroutine id

Go
拉丁的傳說 2023-03-15 13:49:26
我使用 cilium ebpf pakage 編寫了一個 ebpf 程序來獲取 goroutine id。但失敗了。我的 uprobe.c 是這樣的:我認為關(guān)鍵問題是 golang struct g trans to goroutine.h 是錯誤的。誰能幫忙?uprobe.cSEC("uprobe/runtime.newproc1")int uprobe_runtime_newproc1(struct pt_regs *ctx) {    u32 key     = 2;    u64 initval = 1, *valp;    valp = bpf_map_lookup_elem(&uprobe_map, &key);    if (!valp) {        bpf_map_update_elem(&uprobe_map, &key, &initval, BPF_ANY);        return 0;    }    __sync_fetch_and_add(valp, 1);    struct g* goroutine_struct = (void *)PT_REGS_PARM4(ctx);    // retrieve output parameter    s64 goid = 0;    bpf_probe_read(&goid, sizeof(goid), &goroutine_struct->goid);    bpf_printk("bpf_printk bpf_probe_read goroutine_struct->goid: %lld", goid);    struct g gs;    bpf_probe_read(&gs, sizeof(gs), (void *)PT_REGS_PARM4(ctx));    bpf_printk("bpf_printk bpf_probe_read goroutine_struct.goid: %lld", gs.goid);    // test    void* ptr = (void *)PT_REGS_PARM4(ctx);    s64 goid2 = 0;    bpf_probe_read(&goid2, sizeof(goid2), (void *)(ptr+152));    bpf_printk("bpf_printk bpf_probe_read goid2: %lld", goid2);    return 0;}當我運行我的程序時,cat /sys/kernel/debug/tracing/trace_pipe 輸出像這樣,得到錯誤的 go id:<...>-1336127 [000] d... 20113210.986990: bpf_trace_printk: bpf_printk bpf_probe_read goroutine_struct->goid: 4938558469562467144<...>-1336127 [000] d... 20113210.986998: bpf_trace_printk: bpf_printk bpf_probe_read goroutine_struct.goid: 4938558469562467144<...>-1336127 [000] d... 20113210.986998: bpf_trace_printk: bpf_printk bpf_probe_read goid2: 4938558469562467144Blockquote
查看完整描述

1 回答

?
慕容森

TA貢獻1853條經(jīng)驗 獲得超18個贊

我找到了一個解決方案:

  1. 我的 golang 版本是 1.17.2,amd64。amd64 架構(gòu)使用以下 9 個寄存器序列作為整數(shù)參數(shù)和結(jié)果:RAX、RBX、RCX、RDI、RSI、R8、R9、R10、R11

  2. runtime.newproc1 在 go 1.17.2 中有 5 個參數(shù)。callergp *g 是第 4 個。當我 gdb 我的用戶空間程序時,它使用 rdi 寄存器來保存 callergp *g 的 ptr addr。所以使用 PT_REGS_PARM1 是正確的方法。因為 (#define PT_REGS_PARM1(x) ((x)->rdi))

  3. 畢竟,這樣的代碼:

    SEC("uprobe/runtime.newproc1")

    int uprobe_runtime_newproc1(struct pt_regs *ctx) {

        u32 key     = 2;

        u64 initval = 1, *valp;

    

        valp = bpf_map_lookup_elem(&uprobe_map, &key);

        if (!valp) {

            bpf_map_update_elem(&uprobe_map, &key, &initval, BPF_ANY);

            return 0;

        }

        __sync_fetch_and_add(valp, 1);

    

        // retrieve output parameter

        struct g gs;

        bpf_probe_read(&gs, sizeof(gs), (void *)PT_REGS_PARM1(ctx));

        bpf_printk("uprobe_runtime_newproc1 bpf_printk bpf_probe_read goroutine_struct.goid: %lld", gs.goid);

    

        return 0;

    }


查看完整回答
反對 回復(fù) 2023-03-15
  • 1 回答
  • 0 關(guān)注
  • 103 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學習伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號