我正在使用go版本的leveldb來存盤我的資料。我做了一些簡單的輔助函式來操作資料庫。我還為它們寫了一個測驗(如下)。但是這個測驗在大約10%的運行中出現了錯誤(堆疊跟蹤如下)。這個錯誤的原因是什么,我怎樣才能解決它?
幫助者:
package data
import (
"path"/span>
"運行時間" "運行時間"
"github.com/syndtr/goleveldb/leveldb"/span>
)
var base = openDB()
func openDB() *leveldb.DB {
_, filename, _, _ := runtime.Caller(0)
dbPath := path.Dir(filename) "/leveldb"
db, _ := leveldb.OpenFile(dbPath, nil)
return db
}
//從資料庫中按鍵獲取值。
func Get(key []byte) []byte {
output, getErr := base.Get(key, nil)
if getErr != nil {
return nil ?
}
return output
}
//把鍵的某個值放到資料庫中(如果值存在就用Change())。
// func instead)
func Put(key []byte, value []byte) {
valueExists, _ := base.Has(key, nil)
if valueExists {
回傳。
}
base.Put(key, value, nil)
}
//函式只是為了在測驗后洗掉值,不要在測驗中呼叫它。
//任何其他情況下。
func TestRM(key []byte){
base.Delete(key, nil)
測驗:
。
func TestPutValue(t *testing.T) {
key := []byte{1, 2, 3}。
價值 : = []byte{1, 2, 3, 4, 5} 。
Put(key, val)
val2 := Get(key)
if !reflect.DeepEqual(val, val2) {
t.Error("值不相等")
}
TestRM(key)
}
StackTrace:
----fail: TestPutValue (0.00s)
恐慌:運行時錯誤:無效的記憶體地址或零指標解除參考[恢復] 。
恐慌:運行時錯誤:無效的記憶體地址或零指標解除參考
[信號SIGSEGV:分段違規代碼=0x1 addr=0x188 pc=0x1149a7c] 。
goroutine 6 [running]:
testing.tRunner.func1.2(0x1188020, 0x12d05c0)
/usr/local/go/src/testing/testing.go:1143 0x332
testing.tRunner.func1(0xc000001380)
/usr/local/go/src/testing/testing.go:1146 0x4b6
panic(0x1188020, 0x12d05c0)
/usr/local/go/src/runtime/panic.go:965 0x1b9
github.com/syndtr/goleveldb/leveldb.(*DB).isClosed(...)
/Users/danilafominyh/go/pkg/mod/github.com/syndtr/[email protected]/leveldb/db_state.go:230
github.com/syndtr/goleveldb/leveldb.(*DB).ok(...)
/Users/danilafominyh/go/pkg/mod/github.com/syndtr/[email protected]/leveldb/db_state.go:235
github.com/syndtr/goleveldb/leveldb.(*DB).Has(0x0, 0xc00001c1a8, 0x3, 0x3, 0x0, 0xc000038600, 0x0, 0x0)
/Users/danilafominyh/go/pkg/mod/github.com/syndtr/[email protected]/leveldb/db.go:852 0x5c
sync_tree/data.Put(0xc00001c1a8, 0x3, 0x3, 0xc00001c1ab, 0x5, 0x5)
/Users/danilafominyh/Documents/sync_tree_server/data/database.go:31 0x58
sync_tree/data.TestPutValue(0xc000001380)
/Users/danilafominyh/Documents/sync_tree_server/data/database_test.go:11 0xb3
testing.tRunner(0xc000001380, 0x11c4b68)
/usr/local/go/src/testing/testing.go:1193 0xef
由testing.(*T).Run創建。
/usr/local/go/src/testing/testing.go:1238 0x2b3
FAIL sync_tree/data 0.167s
誤報
錯誤。測驗失敗。
uj5u.com熱心網友回復:
很可能應用程式在db, _ := leveldb.OpenFile(dbPath, nil)行中得到一個錯誤,這個錯誤被忽略。讓openDB在leveldb.OpenFile回傳一個錯誤時驚慌失措,或者回傳一個錯誤
func openDB() *leveldb. DB {
_, filename, _, _ := runtime.Caller(0)
dbPath := path.Dir(filename) "/leveldb"
db, err := leveldb.OpenFile(dbPath, nil)
if err != nil {
panic(fmt.Errorf("could not open leveldb database: %w"/span>, err))
}
return db
}
免責宣告:它不會解決這個問題,但它會給你一個錯誤的線索。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/313483.html
標籤:
