This is an automated email from the ASF dual-hosted git repository.

wusheng pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/skywalking-rover.git


The following commit(s) were added to refs/heads/main by this push:
     new d956eae  Fix the uprobe link error in Container mode (#45)
d956eae is described below

commit d956eaede57b62108b78bca48045bd09ba88e653
Author: mrproliu <[email protected]>
AuthorDate: Sat Aug 6 19:45:00 2022 +0800

    Fix the uprobe link error in Container mode (#45)
---
 pkg/profiling/task/network/linker.go | 44 ++++++++++++++++++++++++------------
 pkg/profiling/task/network/runner.go |  2 +-
 pkg/profiling/task/network/ssl.go    | 10 ++++----
 3 files changed, 36 insertions(+), 20 deletions(-)

diff --git a/pkg/profiling/task/network/linker.go 
b/pkg/profiling/task/network/linker.go
index 46015bb..c2d8396 100644
--- a/pkg/profiling/task/network/linker.go
+++ b/pkg/profiling/task/network/linker.go
@@ -75,6 +75,14 @@ type Linker struct {
        closers   []io.Closer
        errors    error
        closeOnce sync.Once
+
+       linkedUProbes map[string]bool
+}
+
+func NewLinker() *Linker {
+       return &Linker{
+               linkedUProbes: make(map[string]bool),
+       }
 }
 
 type UProbeExeFile struct {
@@ -180,35 +188,43 @@ func (m *Linker) OpenUProbeExeFile(path string) 
*UProbeExeFile {
        }
 }
 
-func (m *UProbeExeFile) AddLink(symbol string, enter, exit *ebpf.Program, pid 
int) {
-       m.AddLinkWithType(symbol, true, enter, pid)
-       m.AddLinkWithType(symbol, false, exit, pid)
+func (m *UProbeExeFile) AddLink(symbol string, enter, exit *ebpf.Program) {
+       m.AddLinkWithType(symbol, true, enter)
+       m.AddLinkWithType(symbol, false, exit)
 }
 
-func (m *UProbeExeFile) AddLinkWithType(symbol string, enter bool, p 
*ebpf.Program, pid int) {
+func (m *UProbeExeFile) AddLinkWithType(symbol string, enter bool, p 
*ebpf.Program) {
        if !m.found {
                return
        }
-       var fun func(symbol string, prog *ebpf.Program, opts 
*link.UprobeOptions) (link.Link, error)
+       var t string
        if enter {
-               fun = m.realFile.Uprobe
+               t = "enter"
        } else {
-               fun = m.realFile.Uretprobe
+               t = "exit"
        }
 
-       var t string
+       // check already linked
+       uprobeIdentity := fmt.Sprintf("%s_%s_%t", m.addr, symbol, enter)
+       if m.liker.linkedUProbes[uprobeIdentity] {
+               log.Debugf("the uprobe already attached, so ignored. file: %s, 
symbol: %s, type: %s", m.addr, symbol, t)
+               return
+       }
+       m.liker.linkedUProbes[uprobeIdentity] = true
+
+       var fun func(symbol string, prog *ebpf.Program, opts 
*link.UprobeOptions) (link.Link, error)
        if enter {
-               t = "enter"
+               fun = m.realFile.Uprobe
        } else {
-               t = "exit"
+               fun = m.realFile.Uretprobe
        }
 
-       lk, err := fun(symbol, p, &link.UprobeOptions{PID: pid})
+       lk, err := fun(symbol, p, nil)
        if err != nil {
-               m.liker.errors = multierror.Append(m.liker.errors, 
fmt.Errorf("file: %s, symbol: %s, type: %s, pid: %d, error: %v",
-                       m.addr, symbol, t, pid, err))
+               m.liker.errors = multierror.Append(m.liker.errors, 
fmt.Errorf("file: %s, symbol: %s, type: %s, error: %v",
+                       m.addr, symbol, t, err))
        } else {
-               log.Debugf("attach to the uprobe, file: %s, symbol: %s, type: 
%s, pid: %d", m.addr, symbol, t, pid)
+               log.Debugf("attach to the uprobe, file: %s, symbol: %s, type: 
%s", m.addr, symbol, t)
                m.liker.closers = append(m.liker.closers, lk)
        }
 }
diff --git a/pkg/profiling/task/network/runner.go 
b/pkg/profiling/task/network/runner.go
index 7b00c19..935aa5a 100644
--- a/pkg/profiling/task/network/runner.go
+++ b/pkg/profiling/task/network/runner.go
@@ -65,7 +65,7 @@ type Runner struct {
 func NewGlobalRunnerContext() *Runner {
        return &Runner{
                bpfContext: NewContext(),
-               linker:     &Linker{},
+               linker:     NewLinker(),
        }
 }
 
diff --git a/pkg/profiling/task/network/ssl.go 
b/pkg/profiling/task/network/ssl.go
index aac49bf..ab69f96 100644
--- a/pkg/profiling/task/network/ssl.go
+++ b/pkg/profiling/task/network/ssl.go
@@ -90,12 +90,12 @@ func processOpenSSLProcess(pid int, bpf *bpfObjects, linker 
*Linker, modules []*
 
        // attach the linker
        libSSLLinker := linker.OpenUProbeExeFile(libsslPath)
-       libSSLLinker.AddLink("SSL_write", bpf.OpensslWrite, 
bpf.OpensslWriteRet, pid)
-       libSSLLinker.AddLink("SSL_read", bpf.OpensslRead, bpf.OpensslReadRet, 
pid)
+       libSSLLinker.AddLink("SSL_write", bpf.OpensslWrite, bpf.OpensslWriteRet)
+       libSSLLinker.AddLink("SSL_read", bpf.OpensslRead, bpf.OpensslReadRet)
        return linker.HasError()
 }
 
-func processEnvoyProcess(pid int, bpf *bpfObjects, linker *Linker, modules 
[]*profiling.Module) error {
+func processEnvoyProcess(_ int, bpf *bpfObjects, linker *Linker, modules 
[]*profiling.Module) error {
        moduleName := "/envoy"
        processModules, err := findProcessModules(modules, moduleName)
        if err != nil {
@@ -123,8 +123,8 @@ func processEnvoyProcess(pid int, bpf *bpfObjects, linker 
*Linker, modules []*pr
 
        // attach the linker
        libSSLLinker := linker.OpenUProbeExeFile(envoyModule.Path)
-       libSSLLinker.AddLink("SSL_write", bpf.OpensslWrite, 
bpf.OpensslWriteRet, pid)
-       libSSLLinker.AddLink("SSL_read", bpf.OpensslRead, bpf.OpensslReadRet, 
pid)
+       libSSLLinker.AddLink("SSL_write", bpf.OpensslWrite, bpf.OpensslWriteRet)
+       libSSLLinker.AddLink("SSL_read", bpf.OpensslRead, bpf.OpensslReadRet)
        return linker.HasError()
 }
 

Reply via email to