[gRPC] 使用gRPC异步通信时报错·Bug陈列

[gRPC] 使用gRPC异步通信时报错·Bug陈列

[Bug陈列]系列希望分享一些我自己写过的Bug,用于加深记忆以及帮助其他遇到类似Bug的人。

Bug#1:

在使用gRPC异步通信时,出现这样的报错

pure virtual method called
terminate called without an active exception

在网上找到的处理方法是这样的:

CompletionQueue destructor terminates process with: pure virtual method called - terminate called without an active exception · Issue #17516 · grpc/grpc (github.com)

简而言之,就是在cq执行一个Write事件的时候,相应的ServerContext(或者ClientContext)已经被销毁了。此时cq就是要为一个空的对象执行Write,空对象当然是没有Write方法的,所以就会报错pure virtual method called

通常来讲,我们在使用异步通讯的时候,会使用一个CallData(参考Asynchronous-API tutorial | C++ | gRPC),在这个CallData里执行Write操作,保存requestresponse的内容。然而我在一次Write之后,直接把CallData销毁了。这就导致cq在执行Write时,CallData已经成了空对象,所以就会报错。

Bug#2:

还是在使用gRPC异步通信时,出现这样的报错:

call_op_set.h:985]          assertion failed: false

追溯源码发现了下面这些文字:

image

它已经提示我们了,这个报错肯有可能是我们在上一个操作没有结束时就开始了下一个操作。

具体来说,我连续调用了两次Finish,于是在第二次Finish时就会报错。

正确的做法时在cq->Next()中已经执行完一个操作时,才能执行下一个操作。

posted @ 2022-11-18 14:02  CQzhangyu  阅读(282)  评论(0编辑  收藏  举报