1 回答

TA贡献1853条经验 获得超18个赞
我找到了一个解决方案:
我的 golang 版本是 1.17.2,amd64。amd64 架构使用以下 9 个寄存器序列作为整数参数和结果:RAX、RBX、RCX、RDI、RSI、R8、R9、R10、R11
runtime.newproc1 在 go 1.17.2 中有 5 个参数。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 关注
- 87 浏览
添加回答
举报