簡體   English   中英

如何使用 BPF (BCC) 跟蹤 go 函數

[英]How to trace a go function with BPF (BCC)

我有一些 go-code (myclient)。 它看起來像這樣(這里只有 mypackage 相關):

package mypackage

import (
...

func (o *Client) CreateUser(ctx context.Context, user *User, ...) (User, error) {
    ...
    if err != nil ...
      return nil, err
    ...
    return &user, nil
}

我運行go build -o build/myclient cmd/myclient/main.go來獲取二進制文件。

λ bob [~]  → objdump -t ~/go/src/github.com/Corp/myclient/build/myclient | grep CreateUser
....
000000000087d490 l     F .text  0000000000000e55              github.com/Corp/myclient.(*Client).CreateUser

現在這個二進制文件被其他一些 go 程序使用並被加載。

有點像這樣:

bob      745322  0.1  0.1 195556  33172 pts/1    Sl+  20:18   0:07 some-prog
bob      750774  0.0  0.0 1229316 14188 pts/1    Sl+  20:22   0:00 /home/bob/go/src/github.com/Corp/myclient/build/myclient

現在我嘗試使用 BCC 工具進行跟蹤/調試。 這樣做的原因是在生產中發生了一些奇怪的錯誤,查看上面函數的 args 和返回值很重要。 我受到了這個啟發: http : //www.brendangregg.com/blog/2017-01-31/golang-bcc-bpf-function-tracing.html

使用funccount我在這里看到了這一點(通過對 some-prog 的一些調用來調用該函數之后)

λ bob [~]  → sudo funccount '/home/bob/go/src/github.com/Corp/myclient/build/myclient:*.CreateUser'
Tracing 5 functions for "b'/home/bob/go/src/github.com/Corp/myclient/build/myclient:*.CreateUser'"... Hit Ctrl-C to end.
^C
FUNC                                                    COUNT
...
b'github.com/Corp/myclient.(*Client).CreateUser'        1
Detaching...

但是當我嘗試使用trace (或gotrace )時,它看起來像這樣:

λ bob [~]  → trace '/home/bob/go/src/github.com/Corp/myclient/build/myclient:mypackage.*'  
could not determine address of symbol b'mypackage.*'

λ bob [~]  → trace '/home/bob/go/src/github.com/Corp/myclient/build/myclient:github.com/Corp/myclient.CreateUser'                          
could not determine address of symbol b'github.com/Corp/myclient.CreateUser'

λ bob [~]  → trace '/home/bob/go/src/github.com/Corp/myclient/build/myclient:github.com/Corp/myclient.(*Client).CreateUser'
error in probe '/home/bob/go/src/github.com/Corp/myclient/build/myclient:github.com/Corp/myclient.(*Client).CreateUser': expected format string in "s

λ bob [~]  → trace '/home/bob/go/src/github.com/Corp/myclient/build/myclient:*.CreateUser'                                                               
could not determine address of symbol b'*.CreateUser'

是否有可能使用 BCC 工具或 eBPF/(bpftrace?)(不添加任何代碼)來跟蹤這樣的 go-function(尤其是檢查 struct args 和返回值)

trace 是一個python 腳本,你可以在vim 中打開它,然后搜索一個名為_parse_probe 的函數。 在這個函數中,第 96 行:

(spec, sig, rest) = re.match(r'([^ \t\(]+)(\([^\(]*\))?(.*)', text).groups()                                    

帶有 '(' 字符的 golang 函數符號被拆分為 3 部分,而普通函數將匹配第一個正則子字符串。您可以修改正則表達式——刪除 '(' 部分,然后 trace 就可以工作了。祝你好運。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM