[Solved] Go use zoom to connect DM database and start reporting error in Linux

Golang, beego framework uses worm to connect DM database, and starts to report invalid memory address or nil point dereference under Linux

GOPATH=/home/wt207/go-space #gosetup
/home/wt207/go/bin/go build -o /tmp/___1go_build_main_go -gcflags all=-N -l /home/wt207/go-space/insight-client/main.go #gosetup
/home/wt207/GoLand-2021.1.3/plugins/go/lib/dlv/linux/dlv --listen= --headless=true --api-version=2 --check-go-version=false --only-same-user=false exec /tmp/___1go_build_main_go --
API server listening at: [::]:40223
panic: runtime error: invalid memory address or nil pointer dereference
[signal SIGSEGV: segmentation violation code=0x1 addr=0x0 pc=0xd34e4e]

goroutine 1 [running]:
gitee.com/chunanyong/dm.(*Properties).GetTrimString(0x0, 0x158d9c9, 0xc, 0x0, 0x0, 0x0, 0x0)
        /home/wt207/go-space/pkg/mod/gitee.com/chunanyong/[email protected]/zv.go:80 +0x6e
gitee.com/chunanyong/dm.(*DmConnector).mergeConfigs(0xc000034600, 0x15b2b55, 0x28, 0x0, 0x0)
        /home/wt207/go-space/pkg/mod/gitee.com/chunanyong/[email protected]/n.go:767 +0x274
gitee.com/chunanyong/dm.(*DmDriver).openConnector(0xc00015ce80, 0x15b2b55, 0x28, 0x0, 0x0, 0x0)
        /home/wt207/go-space/pkg/mod/gitee.com/chunanyong/[email protected]/p.go:79 +0x105
gitee.com/chunanyong/dm.(*DmDriver).OpenConnector(0xc00015ce80, 0x15b2b55, 0x28, 0x0, 0x0, 0x0, 0x0)
        /home/wt207/go-space/pkg/mod/gitee.com/chunanyong/[email protected]/p.go:63 +0x6d
database/sql.Open(0x157561c, 0x2, 0x15b2b55, 0x28, 0x0, 0x0, 0x0)
        /home/wt207/go/src/database/sql/sql.go:771 +0x1cb
gitee.com/chunanyong/zorm.newDataSource(0xc00007fb00, 0x0, 0x0, 0x0)
        /home/wt207/go-space/pkg/mod/gitee.com/chunanyong/[email protected]/dataSource.go:59 +0xdc
gitee.com/chunanyong/zorm.NewDBDao(0xc00007fb00, 0x0, 0x0, 0x0)
        /home/wt207/go-space/pkg/mod/gitee.com/chunanyong/[email protected]/DBDao.go:70 +0x6b
        /home/wt207/go-space/insight-client/main.go:54 +0x91

Debugger finished with the exit code 0

The database connection configuration is as follows:

func main() {
	//Custom zorm log output
	//zorm.LogCallDepth = 4 //level of logging calls
	//zorm.FuncLogError = myFuncLogError //function to record exception logs
	//FuncLogPanic = myFuncLogPanic //logging panic log, default use ZormErrorLog implementation
	//FuncPrintSQL = myFuncPrintSQL // function to print sql

	//custom log output format, reassign FuncPrintSQL function
	//zorm.FuncPrintSQL = zorm.

	//dbDaoConfig database configuration. Here is just a simulation, production should be reading configuration configuration file, construct DataSourceConfig
	dbDaoConfig := zorm.DataSourceConfig{
		//DSN database connection string
		DSN: "dm://GO207:[email protected]:5236",
		//DSN: ". /db/test.db",
		//database driver name: mysql,postgres,oci8,sqlserver,sqlite3,dm,kingbase,aci and DBType correspond, handle databases with multiple drivers
		DriverName: "dm",
		// Database type (dialect judgment basis): mysql,postgresql,oracle,mssql,sqlite,dm,kingbase,shentong and DriverName correspond, processing database has more than one driver
		DBType: "dm",
		//MaxOpenConns Maximum number of database connections Default 50
		MaxOpenConns: 50,
		MaxIdleConns: 50, //MaxIdleConns: 50, //MaxIdleConns: 50
		MaxIdleConns: 50,
		//ConnMaxLifetimeSecond connection lifetime seconds. Default is 600 (10 minutes) after the connection is destroyed and rebuilt. MySQL default wait_timeout 28800 seconds (8 hours)
		ConnMaxLifetimeSecond: 600,
		//will use FuncPrintSQL to record SQL.
		PrintSQL: true,
		//DefaultTxOptions default configuration of transaction isolation level, default is nil
		//DefaultTxOptions: nil,
		//TxOptions{Isolation: sql.LevelDefault},

	// Create dbDao according to dbDaoConfig, a database is executed only once, the first database to be executed is defaultDao, the subsequent zorm.xxx method, the default is used is defaultDao
	var err error
	dbDao, err = zorm.NewDBDao(&dbDaoConfig)
	// Mark the test as failed
	if err ! = nil {
		fmt.Println("dm database connection failed:", err)
	} else {
		fmt.Println("dm database connection successful")



The reason is to get the system default DM_ Svc.conf configuration file failed. According to the error prompt of the console, we can find the following method to get the DM of different systems_ SVC. Conf configuration file.

if filePath == "" {
    switch runtime.GOOS {
        case "windows":
	    filePath = os.Getenv("SystemRoot") + "\\system32\\dm_svc.conf"
        case "linux":
	    filePath = "/etc/dm_svc.conf"

According to the default file path of windows system, find DM_ Open the SVC. Conf configuration file and find the following



Creating DM in /etc path of Linux virtual machine_ SVC. Conf configuration file, the content of which is similar to the OS. Getenv ("systemroot") + "\ \ system32 \ \ DM of windows_ SVC. Conf " DM under Path_ SVC. Conf configuration file can be consistent

Read More: