-
Notifications
You must be signed in to change notification settings - Fork 26
Open
Description
基本信息:
- 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。
这个堆栈并不固定, 但是表现是一致:
一个go协程里面里面执行了调用ticker的逻辑, 例如 for range ticker.C, 然后代码就会走到下面的个执行流程 runtime.chanrecv2->runtime.chanrecv->...->trap.trap->...->runtime.Throw, 在trap.trap 执行defer逻辑, 然后程序就崩了。
其他
- 这边尝试复现, 但是并没办法复现出来, 只在某个工程的某个测试用例里面出现,这个工程也有其他用例用了xgo的mock.Patch 但是并没有出现这个问题。
- 堆栈中出现的go协程, 是用例启动的时候, 依赖包的init函数拉起的, 非用例自身启动。
Metadata
Metadata
Assignees
Labels
No labels
