【问题标题】:How to use a struct for golang fuction args in bpftrace如何在 bpftrace 中为 golang 函数参数使用结构
【发布时间】:2020-12-22 17:35:22
【问题描述】:

我有以下代码:

package main

import "fmt"

type foo struct {
    bar  string
    some int
}

//go:noinline
func sum(a int, b int) {
    fmt.Printf("Sum: %d\n", (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 %d\n", _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: %d\n", $s->length);
  printf("array: %s\n", str(*($array), $length));
  printf("somevalue: %d\n", $s->somevalue);
  // this one will be empty
  printf("array: %s\n", 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

使用reg("sp") 没有任何问题,但是当使用用户定义的结构时,数组似乎是“空的”。 $s->length 似乎是 12,但是当分配给一个额外的变量时,它变成了 2... 有人可以帮忙吗?

【问题讨论】:

    标签: go stack trace ebpf


    【解决方案1】:

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

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

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

    【讨论】:

      猜你喜欢
      • 2018-11-06
      • 1970-01-01
      • 2021-03-17
      • 2021-05-19
      • 1970-01-01
      • 1970-01-01
      • 2018-05-21
      • 2021-11-14
      • 1970-01-01
      相关资源
      最近更新 更多