【问题标题】:Passing byte array to plugin function将字节数组传递给插件函数
【发布时间】:2018-12-26 00:20:51
【问题描述】:

我需要编写一个带有接受 golang 字节数组的函数的 golang 插件,但是当我在客户端代码中加载插件后尝试调用此函数时,它总是给我

panic:运行时错误:无效的内存地址或 nil 指针取消引用 [信号SIGSEGV:分段违规代码=0x1 addr=0x18 pc=0x40b22af]

关于如何解决这个问题的任何建议?

要重现的代码(高度简化,但会出现同样的错误)

client.go

package main

import (
    "plugin"
    "log"
)

type T interface {
    sayHi(data []byte)
}

func main()  {
    plgin, _ := plugin.Open("./plugin.so")
    symbol, _ := plgin.Lookup("Endpoint")
    b, _ := symbol.(T)
    log.Println("From main")
    data := []byte{1,2,3,4,5}
    b.sayHi(data)

}

plugin.go(这个程序是用buildmode=plugin构建的)

package main

import (
    "log"
)

type dummy struct {}

func (d dummy)sayHi(data []byte)  {
    log.Println("From plugin")
    log.Println(data)
}

var Endpoint dummy


func main() {

}

【问题讨论】:

    标签: go plugins segmentation-fault


    【解决方案1】:

    首先,您应该始终检查返回的错误(以及插件符号的类型断言结果)!

    您的问题是 sayHi() 方法未导出。所以如果你在你的应用中创建一个接口,它不会匹配插件中创建的未导出的方法。

    导出方法,它会起作用(假设您没有收到任何其他错误)。

    在插件中:

    func (d dummy) SayHi(data []byte) {
        log.Println("From plugin")
        log.Println(data)
    }
    

    在您的主应用中:

    type T interface {
        SayHi(data []byte)
    }
    

    当调用它时:

    b.SayHi(data)
    

    这里有一点需要注意。当您从插件中查找变量时,您会获得一个指向该变量的 指针(否则您无法更改其值)。详情请见:Plugin symbol as function return。这意味着symbol 的类型将是*dummy,而不是dummy。这在这里不会造成任何麻烦,因为*dummymethod set 也包含SayHi() 方法,就像dummy 的方法集一样,但是如果您尝试键入 -从插件符号中断言非接口类型(具体类型)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-02-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-21
      • 2020-07-28
      相关资源
      最近更新 更多