如何在bpftrace中为golang函数args使用结构



我有以下go代码:

package main
import "fmt"
type foo struct {
bar  string
some int
}
//go:noinline
func sum(a int, b int) {
fmt.Printf("Sum: %dn", (a + b))
}
//go:noinline
func (f *foo) baz(value string) string {
return f.bar
}
//go:noinline
func (f *foo) nested(_f foo) foo {
fmt.Printf("Arg value: %s and %dn", _f.bar, _f.some)
return _f
}
func main() {
f := foo{
bar:  "hello world!",
some: 42,
}
fmt.Println(f.baz(f.bar))
sum(1, 2)
temp := f.nested(f)
fmt.Println(temp.bar)
}

以下脚本或我在使用结构定义时遇到了正确取消引用字符串结构的问题:

struct args
{
uint64_t array;
uint64_t length;
uint64_t somevalue;
};
uprobe:/tmp/main:0x49aa00 {
$s = (struct args *)(reg("sp") + 16);
$length = *(reg("sp") + 24);
$array  = reg("sp") + 16;
printf("length: %dn", $s->length);
printf("array: %sn", str(*($array), $length));
printf("somevalue: %dn", $s->somevalue);
// this one will be empty
printf("array: %sn", str($s->array, $s->length));
}

输出:

Attaching 1 probe...
length: 12
array: hello world!
somevalue: 42
array: 

删除$s->length打印64个字节(默认值(,但是:

hello world!host is downillegal seekinvalid slotlfstack.pushmad

使用CCD_ 2工作时没有任何问题,但是当使用用户定义的结构时;空";。$s->length看起来是12,但当分配给一个额外的变量时,它变成了2……有人能帮忙吗?

我已经在ubuntu 20.04中用bpftrace 0.9.4测试了您的代码,这似乎是同样的问题。

之后,我用最新版本构建了bpftrace,一切都很好。你可以试一试。

Attaching 1 probe...
length: 12
array: hello world!
somevalue: 42
array: hello world!

相关内容

  • 没有找到相关文章

最新更新