当前的版本可以应用于生产环境么?
0xlwoe21k opened this issue · comments
我们生产环境目前有个需求需要用到动态hook,想问一下您,当前这个版本可以稳定运行在生产环境么?
如果只是拦截,非常稳定,如果需要回调旧函数,目前看也稳定,但有两个注意事项:
- 参数在新旧函数上在逃逸方面是否会不同。
- 运行时对 backtrace 信息准确性是否依赖。
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 一下参数。
明白了,非常感谢。