<Bug陳列> [gRPC] 使用gRPC異步通信時報錯
[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()中已經執行完一個操作時,才能執行下一個操作。