brahma-adshonor / gohook

a funny library to hook golang function at runtime

Home Page:https://www.cnblogs.com/catch/p/10973611.html

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

当前的版本可以应用于生产环境么?

0xlwoe21k opened this issue · comments

commented

我们生产环境目前有个需求需要用到动态hook,想问一下您,当前这个版本可以稳定运行在生产环境么?

如果只是拦截,非常稳定,如果需要回调旧函数,目前看也稳定,但有两个注意事项:

  1. 参数在新旧函数上在逃逸方面是否会不同。
  2. 运行时对 backtrace 信息准确性是否依赖。
commented

1.针对第一点,参数在新旧函数的逃逸,我不是太理解,能否深入解释一下,感谢
2.针对第二点,我们运行时不依赖backtrack的准确性,只会log记录一下。

type Data struct {
  data string;
};

func foo(p *Data) {
  fmt.Printf("%s", p->data);   // not escape.
}

func goo(p *Data) {
  go func() {
    fmt.Printf("%s", p->data);   
   }(); // escape p.
}

func main() {
  gohook.Hook(foo, goo, NULL);
  
  pd := & Data { "abcd" }; // 栈上

  foo(pd);
}

因为 foo 不会传递参数到别的地方,逃逸分析可以判断 main 中的 pd 可以分配到栈上,但调用 foo 实际是跳转到 goo,goo 会传递参数给别的协程,参数必须分配在堆上。

所以替换函数最好对参数的使用上需要注意是否会外传,如果有,最好确认一下原函数是否相同,保险的做法就是替换函数内部自己 copy 一下参数。

commented

明白了,非常感谢。