Code Monkey home page Code Monkey logo

Comments (7)

YuJuncen avatar YuJuncen commented on May 9, 2024 4

看起来有点像是 flvWriter.SendPacketflvWriter.Close 的竞争条件,这里给一个推测,不一定正确:

  1. Go 的 http 库会在 Handler 返回的时候,调用 response.finishRequest 方法,这个方法会调用 response 内部的 bufio.WriterReset(nil)
  2. 一般而言,httpflv/server.handleConn 会等待 flvWriter 结束。
  3. flvWriter.Close 会关闭 packetQueueclosedChan,后者让 handleConn 结束,前者让 SendPacket 结束。

但是,SendPacket 在发送之前并不会检查自身是否已经结束:

if _, err := flvWriter.ctx.Write(h); err != nil {
return err
}
if _, err := flvWriter.ctx.Write(p.Data); err != nil {
return err
}

所以,假如说有以下的执行序列:

  1. 某处调用 flvWriter.Close
  2. handleConn 发现 closedChan 关闭,返回;http 库执行 finishRequest
  3. 此时,SendPacket 进入了这个分支:
    if ok {
    flvWriter.RWBaser.SetPreTime()
    h := flvWriter.buf[:headerLen]
    typeID := av.TAG_VIDEO
    if !p.IsVideo {
    if p.IsMetadata {
    var err error
    typeID = av.TAG_SCRIPTDATAAMF0
    p.Data, err = amf.MetaDataReform(p.Data, amf.DEL)
    if err != nil {
    return err
    }
    } else {
    typeID = av.TAG_AUDIO
    }
    }
    dataLen := len(p.Data)
    timestamp := p.TimeStamp
    timestamp += flvWriter.BaseTimeStamp()
    flvWriter.RWBaser.RecTimeStamp(timestamp, uint32(typeID))
  4. 在执行到
    if _, err := flvWriter.ctx.Write(h); err != nil {

    或者
    if _, err := flvWriter.ctx.Write(p.Data); err != nil {

    的时候,就可能会遇到往空 io.Writer 写数据的 panic。

from livego.

gwuhaolin avatar gwuhaolin commented on May 9, 2024

请提供错误详细堆栈

from livego.

joastonish avatar joastonish commented on May 9, 2024

2017/06/16 10:20:37 writer.go:159: http flv closed
panic: runtime error: invalid memory address or nil pointer dereference
[signal SIGSEGV: segmentation violation code=0x1 addr=0x20 pc=0x501558]

goroutine 4988871 [running]:
bufio.(*Writer).Flush(0xc420012b00, 0xc422c98d44, 0x6e9)
/usr/local/Cellar/go/1.8.3/libexec/src/bufio/bufio.go:566 +0x58
bufio.(*Writer).Write(0xc420012b00, 0xc422c98d44, 0x2620, 0x622bc, 0xb, 0x0, 0x0)
/usr/local/Cellar/go/1.8.3/libexec/src/bufio/bufio.go:602 +0xdf
net/http.(*response).write(0xc420180540, 0x2620, 0xc422c98d44, 0x2620, 0x622bc, 0x0, 0x0, 0xb, 0x0, 0x0)
/usr/local/Cellar/go/1.8.3/libexec/src/net/http/server.go:1525 +0x150
net/http.(*response).Write(0xc420180540, 0xc422c98d44, 0x2620, 0x622bc, 0xb, 0x0, 0x0)
/usr/local/Cellar/go/1.8.3/libexec/src/net/http/server.go:1495 +0x64
github.com/gwuhaolin/livego/protocol/httpflv.(*FLVWriter).SendPacket(0xc4200f6240, 0x0, 0x0)
/Users/halwu/go/src/github.com/gwuhaolin/livego/protocol/httpflv/writer.go:134 +0x20c
github.com/gwuhaolin/livego/protocol/httpflv.NewFLVWriter.func1(0xc4200f6240)
/Users/halwu/go/src/github.com/gwuhaolin/livego/protocol/httpflv/writer.go:47 +0x2f
created by github.com/gwuhaolin/livego/protocol/httpflv.NewFLVWriter
/Users/halwu/go/src/github.com/gwuhaolin/livego/protocol/httpflv/writer.go:52 +0x387

from livego.

joastonish avatar joastonish commented on May 9, 2024

我找到重现的方法了。一直调用,用火狐测试大概是27个小时多一点的时候,就会出现这个错误。

from livego.

sduqlsc avatar sduqlsc commented on May 9, 2024

@gwuhaolin 这个问题解决了吗?

from livego.

22125236 avatar 22125236 commented on May 9, 2024

panic: runtime error: invalid memory address or nil pointer dereference
[signal 0xc0000005 code=0x0 addr=0x18 pc=0x63f603]

goroutine 77131459 [running]:
bufio.(*Writer).Flush(0xc004717800, 0xc00579f94e, 0x61)
c:/go/src/bufio/bufio.go:591 +0x63
bufio.(*Writer).Write(0xc004717800, 0xc00579f94e, 0x1dd, 0x236b2, 0xb, 0x0, 0x0)
c:/go/src/bufio/bufio.go:627 +0x101
net/http.(*response).write(0xc0002b6c40, 0x1dd, 0xc00579f94e, 0x1dd, 0x236b2, 0x0, 0x0, 0xb, 0x0, 0x0)
c:/go/src/net/http/server.go:1578 +0x2dc
net/http.(*response).Write(0xc0002b6c40, 0xc00579f94e, 0x1dd, 0x236b2, 0xb, 0x0, 0x0)
c:/go/src/net/http/server.go:1547 +0x5d
github.com/gwuhaolin/livego/protocol/httpflv.(*FLVWriter).SendPacket(0xc001420000, 0xa8bb28, 0xc00324f1e0)
C:/Users/renzo/code/nslive/protocol/httpflv/writer.go:144 +0x198
github.com/gwuhaolin/livego/protocol/httpflv.NewFLVWriter.func1(0xc001420000)
C:/Users/renzo/code/nslive/protocol/httpflv/writer.go:49 +0x36
created by github.com/gwuhaolin/livego/protocol/httpflv.NewFLVWriter
C:/Users/renzo/code/nslive/protocol/httpflv/writer.go:48 +0x362

使用6路推流原画时,当推流速度很小的情况下(测试时约为0.6x),会出现以上错误

from livego.

litterGuy avatar litterGuy commented on May 9, 2024

时不时会出现这个问题,但是没找到出现的规律。这个问题有解决方案了吗?
`
panic: runtime error: invalid memory address or nil pointer dereference
[signal SIGSEGV: segmentation violation code=0x1 addr=0x18 pc=0x50ada2]

goroutine 153 [running]:
bufio.(*Writer).Flush(0xc0000d5bc0, 0xc0011dfbef, 0x7f5)
G:/Program Files/Go/src/bufio/bufio.go:607 +0x62
bufio.(*Writer).Write(0xc0000d5bc0, 0xc0011dfbef, 0x2981, 0x5b411, 0xb, 0x0, 0x0)
G:/Program Files/Go/src/bufio/bufio.go:643 +0xfc
net/http.(*response).write(0xc00021c2a0, 0x2981, 0xc0011dfbef, 0x2981, 0x5b411, 0x0, 0x0, 0xb, 0x0, 0x0)
G:/Program Files/Go/src/net/http/server.go:1615 +0x38a
net/http.(*response).Write(0xc00021c2a0, 0xc0011dfbef, 0x2981, 0x5b411, 0xb, 0x0, 0x0)
G:/Program Files/Go/src/net/http/server.go:1573 +0x56
github.com/gwuhaolin/livego/protocol/httpflv.(*FLVWriter).SendPacket(0xc0000c4000, 0x7fc2f1b3f028, 0xc0000765a0)
E:/go/src/livego/protocol/httpflv/writer.go:151 +0x198
github.com/gwuhaolin/livego/protocol/httpflv.NewFLVWriter.func1(0xc0000c4000)
E:/go/src/livego/protocol/httpflv/writer.go:55 +0x2f
created by github.com/gwuhaolin/livego/protocol/httpflv.NewFLVWriter
E:/go/src/livego/protocol/httpflv/writer.go:54 +0x35f
`

from livego.

Related Issues (20)

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.