亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

FlatBuffers 的多語言集成問題

FlatBuffers 的多語言集成問題

Go
慕斯王 2023-05-08 14:42:13
問題當我嘗試訪問包含從一個客戶端流式傳輸到服務器的消息的緩沖區的一部分(使用創建)時,我panic: runtime error: slice bounds out of range從生成的服務器文件中反復出現崩潰( )。 這個問題只出現在客戶端和服務器端集成的時候。自己測試,client和server都使用成功,server沒有crash 知道: - 發送和接收是一樣的,(排除通信方式的問題) - 之前發送的數據格式正確它被放入'并發送。 是什么原因造成的?flatbuffersflatbuffersflatbuffers// see the boundary tests belowbyte[]flatbuffersbuffer問題上下文和詳細信息我有c++ 一個go 使用FlatBuffers. _客戶端和服務器都有自動邊界測試,確認它們各自“正確地”使用flatbuffers它們應該的方式。(即客戶端在發送緩沖區之前創建緩沖區,服務器在訪問緩沖區之前接收緩沖區)這些測試有效。我們正在使用FlatBuffers-v1.10.0我的問題是,當它們一起使用時,服務器在訪問緩沖區時 總是出現以下錯誤:panic: runtime error: slice bounds out of range  goroutine 19 [running]:github.com/google/flatbuffers/go.(*Table).GetVOffsetT(...)     /home/.../go/github.com/google/flatbuffers/go/table.go:134github.com/google/flatbuffers/go.(*Table).OffsetT(0x4000045c68, 0x4000000004, 0x4000160008)     /home/.../go/github.com/google/flatbuffers/go/table.go:16 +0xf0github.com/PhantomIntelligence/Server/lib/Protocol/Stream.(*StreamedData).Id(0x4000045c68, 0x4000045c68)     /home/.../go/github.com/PhantomIntelligence/Server/lib/Protocol/Stream/SteamedData.go:30 +0x2cgithub.com/PhantomIntelligence/Server/dataAccess/conversion/flatBuffers.ConvertStreamMessage(0x4000015a000, 0xa7c, 0xe00, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0)     /home/.../go/github.com/PhantomIntelligence/Server/dataAccess/conversion/flatBuffers/deserialization.go:55 +0x1fc... // the rest is irrelevant for this question's purpose 導致崩潰的數據當服務器嘗試訪問它以使用它時,崩潰總是發生在服務器接收到的第一個緩沖區上。更具體地說,它總是在嘗試訪問ContainerData7th 的(0th, 12th or 15th) 時發生Container。知道對于這個用例,我們發送一個帶有 16 個容器的StreamedData,每個容器包含 16 個ContainerData代碼詳情請注意,只有結構保留在我的原始實現中。我不能泄露我們處理的數據的性質。因此對象名稱可能看起來很奇怪,但結構是相關的部分。架構編譯客戶c++ 端在編譯期間運行它:flatc -o lib/ --no-js-exports --no-prefix --scoped-enums --cpp schemas/*.fbs服務器在編譯期間運行它 go :flatc -o lib/ --no-js-exports --no-prefix --scoped-enums --go schemas/*.fbs圖式客戶端和服務器都使用以下模式:請注意,此摘錄不是完整的架構,只是與此問題相關的部分。
查看完整描述

2 回答

?
烙印99

TA貢獻1829條經驗 獲得超13個贊

不確定這是否是整個問題,但快速瀏覽一下convertStreamMessage就會發現一個主要問題:這FlatBufferBuilder是一個超出范圍的局部變量,就像您返回指向其正在被破壞的內部數據的原始指針一樣。

您要么希望確保FlatBufferBuilder發送數據后仍然存在,要么改為用作FlatBufferBuilder::Release()返回值。

另請注意,在調試這些問題時,您可以使用 C++ 驗證程序(或任何讀取數據的代碼)在發送數據之前檢查數據,這樣可以更早地發現此問題。


查看完整回答
反對 回復 2023-05-08
?
牧羊人nacy

TA貢獻1862條經驗 獲得超7個贊

最后解決我的問題的只是增加客戶中生成器的初始緩沖區大小。

似乎當構建器調整大小時,位于初始緩沖區末尾(在動態調整大小之前)旁邊的 2 個字節未被使用或丟失了數據。

我在客戶端使用的測試數據沒有提出這個問題,它的有效負載比我們使用的真實數據小一點,所以當測試運行時,沒有發生調整大小。

查看完整回答
反對 回復 2023-05-08
  • 2 回答
  • 0 關注
  • 228 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號