問題當我嘗試訪問包含從一個客戶端流式傳輸到服務器的消息的緩沖區的一部分(使用創建)時,我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++ 驗證程序(或任何讀取數據的代碼)在發送數據之前檢查數據,這樣可以更早地發現此問題。

牧羊人nacy
TA貢獻1862條經驗 獲得超7個贊
最后解決我的問題的只是增加客戶端中生成器的初始緩沖區大小。
似乎當構建器調整大小時,位于初始緩沖區末尾(在動態調整大小之前)旁邊的 2 個字節未被使用或丟失了數據。
我在客戶端使用的測試數據沒有提出這個問題,它的有效負載比我們使用的真實數據小一點,所以當測試運行時,沒有發生調整大小。
- 2 回答
- 0 關注
- 228 瀏覽
添加回答
舉報
0/150
提交
取消