Skip to content

运行测试用例出现fatal error: defer on system stack错误 #374

@xxxsen

Description

@xxxsen

基本信息:

  • go version: 1.23
  • xgo version: 1.1.10
  • os: mac os(M1 arm64)

测试代码

// 出现异常的代码, 非复现代码, 这边尝试最简代码进行复现, 但是没有成功。
// 简单调用mock.Patch 函数 对一个包里面的函数进行mock
func TestShouldDeleteVideo(t *testing.T) {
	ctx := context.Background()

	// Mock ES service to return error
	_ = mock.Patch(es_service.GetPostsWithVidV2, func(
		ctx context.Context,
		vfid string,
		limit uint32,
	) ([]*pb.PostSchema, uint32, error) {
		return nil, 0, errors.New("ES service error")
	})
	result, _ := ShouldDeleteVideo(ctx, 0, "0", "0", []string{})
	assert.False(t, result)
}

表现

执行测试用例, 必现fatal error: defer on system stack

下面是出现问题的时候的堆栈:
Image

这个堆栈并不固定, 但是表现是一致:

一个go协程里面里面执行了调用ticker的逻辑, 例如 for range ticker.C, 然后代码就会走到下面的个执行流程 runtime.chanrecv2->runtime.chanrecv->...->trap.trap->...->runtime.Throw, 在trap.trap 执行defer逻辑, 然后程序就崩了。

Image Image

其他

  • 这边尝试复现, 但是并没办法复现出来, 只在某个工程的某个测试用例里面出现,这个工程也有其他用例用了xgo的mock.Patch 但是并没有出现这个问题。
  • 堆栈中出现的go协程, 是用例启动的时候, 依赖包的init函数拉起的, 非用例自身启动。

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions