问题描述
我需要在Go中处理C代码。 libxml和github.com/jbowtie/gokogiri/xml用于生成XML文件。但是,编码没有出现在最终文档中,因此我明确设置了编码(docPtr.encoding = enc
):
func xmlSaveTree(docPtr *C.xmlDoc,encoding []byte,options int,outputBuffer []byte) ([]byte,int) {
var (
cEncoding *C.char
)
if len(encoding) > 0 {
enc := cbuf(encoding)
docPtr.encoding = enc
defer C.free(unsafe.Pointer(enc))
cEncoding = C.CString(string(encoding))
defer C.free(unsafe.Pointer(cEncoding))
}
wbufferMutex.Lock()
defer wbufferMutex.Unlock()
if outputBuffer == nil {
outputBuffer = make([]byte,0)
}
wbuffer = &WriteBuffer{Buffer: outputBuffer}
ret := int(C.MY_xmlSaveDoc(docPtr,cEncoding,C.int(options)))
if ret < 0 {
panic("output error in xml node serialization: " + strconv.Itoa(ret))
}
b,o := wbuffer.Buffer,wbuffer.Offset
wbuffer = nil
return b,o
}
func cbuf(buf []byte) *C.uchar {
var bufptr *byte
if cap(buf) > 0 {
bufptr = &(buf[:1][0])
}
return (*C.uchar)(bufptr)
}
使用此代码会导致细分违规:
严重错误:运行时执行期间出现意外信号[信号 SIGSEGV:细分违规代码= 0x1 addr = 0x0 pc = 0x7f0519e25c71]
运行时堆栈:runtime.throw(0x6bed23,0x2a) /home/usr/.go/src/runtime/panic.go:1116 + 0x72 runtime.sigpanic() /home/usr/.go/src/runtime/signal_unix.go:704 + 0x4ac
goroutine 39 [syscall]:runtime.cgocall(0x63c840、0xc000050b48、0x0) /home/usr/.go/src/runtime/cgocall.go:133 + 0x5b fp = 0xc000050b18 sp = 0xc000050ae0 pc = 0x40859b gitlab.com/company/xmlmix/document/internal._Cfunc_free(0xa64258) _cgo_gotypes.go:265 + 0x45 fp = 0xc000050b48 sp = 0xc000050b18 pc = 0x57eb05 gitlab.com/company/xmlmix/document/internal.xmlSaveTree.func1.1() /mnt/Entwicklung/project/xmlmix/document/internal/marshal.go:82 + 0x53 fp = 0xc000050b80 sp = 0xc000050b48 pc = 0x57fa33 gitlab.com/company/xmlmix/document/internal.xmlSaveTree(0x27ae130, 0xa64258、0x5、0x5、0x23、0xaa7408、0x0、0x0、0xc0001ac000、0x2534, ...) /mnt/project/xmlmix/document/internal/marshal.go:102 + 0x2b0 fp = 0xc000050c18 sp = 0xc000050b80 pc = 0x57f710 gitlab.com/company/xmlmix/document/internal.XMLSaveDoc(0x701920, 0xc0000fa990、0x23、0xa64258、0x5、0x5、0xe,0xf,0xc000050d48, 0x555855,...) /mnt/project/xmlmix/document/internal/marshal.go:62 + 0xe7 fp = 0xc000050c90 sp = 0xc000050c18 pc = 0x57f3c7 gitlab.com/company/xmlmix/document.MarshalIndent(0xc0000a68b8,0x0, 0x0、0x0、0x0、0x0) /mnt/project/xmlmix/document/marshal.go:50 + 0x105 fp = 0xc000050d58 sp = 0xc000050c90 pc = 0x5d92c5
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)