[gRPC] 使用gRPC异步通信时报错·Bug陈列
[gRPC] 使用gRPC异步通信时报错·Bug陈列
[Bug陈列]系列希望分享一些我自己写过的Bug,用于加深记忆以及帮助其他遇到类似Bug的人。
Bug#1:
在使用gRPC异步通信时,出现这样的报错
pure virtual method called
terminate called without an active exception
在网上找到的处理方法是这样的:
简而言之,就是在cq执行一个Write事件的时候,相应的ServerContext(或者ClientContext)已经被销毁了。此时cq就是要为一个空的对象执行Write,空对象当然是没有Write方法的,所以就会报错pure virtual method called
。
通常来讲,我们在使用异步通讯的时候,会使用一个CallData
(参考Asynchronous-API tutorial | C++ | gRPC),在这个CallData里执行Write
操作,保存request
和response
的内容。然而我在一次Write
之后,直接把CallData销毁了。这就导致cq在执行Write时,CallData已经成了空对象,所以就会报错。
Bug#2:
还是在使用gRPC异步通信时,出现这样的报错:
call_op_set.h:985] assertion failed: false
追溯源码发现了下面这些文字:
它已经提示我们了,这个报错肯有可能是我们在上一个操作没有结束时就开始了下一个操作。
具体来说,我连续调用了两次Finish,于是在第二次Finish时就会报错。
正确的做法时在cq->Next()中已经执行完一个操作时,才能执行下一个操作。
| 欢迎来原网站坐坐! >原文链接<