1 回答

TA貢獻1853條經(jīng)驗 獲得超18個贊
我找到了一個解決方案:
我的 golang 版本是 1.17.2,amd64。amd64 架構(gòu)使用以下 9 個寄存器序列作為整數(shù)參數(shù)和結(jié)果:RAX、RBX、RCX、RDI、RSI、R8、R9、R10、R11
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))
畢竟,這樣的代碼:
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;
}
- 1 回答
- 0 關(guān)注
- 103 瀏覽
添加回答
舉報