<Bug陳列> [gRPC] 使用gRPC異步通信時報錯

<Bug陳列> [gRPC] 使用gRPC異步通信時報錯

[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()中已經執行完一個操作時,才能執行下一個操作。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章