Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Kemahiran mengesan rantai panggilan fungsi Golang

Kemahiran mengesan rantai panggilan fungsi Golang

WBOY
WBOYasal
2023-05-16 08:11:101957semak imbas

Golang ialah bahasa pembangunan yang cekap, ringkas dan serentak dengan banyak ciri dan fungsi yang sangat baik. Dalam proses pembangunan aplikasi Golang, kami sering menghadapi masalah yang lebih kompleks, seperti pengesanan rantai panggilan fungsi. Pada masa ini, kita perlu menguasai beberapa kemahiran untuk menjejaki rantai panggilan fungsi dengan lebih baik dan menyelesaikan masalah dalam pembangunan aplikasi.

Artikel ini akan memperkenalkan teknik pengesanan rantai panggilan fungsi Golang, termasuk fungsi tindanan panggilan, Stacktrace, dsb.

Fungsi tindanan panggilan

Di Golang, kita boleh menggunakan fungsi dalam pakej runtime Caller(i int) (pc uintptr, file string, line int, ok bool) untuk mendapatkan maklumat laluan penuh fungsi yang sedang dilaksanakan oleh program semasa dan mengembalikan fail nama dan baris di mana fungsi itu terletak No. maklumat, dsb. Pada masa yang sama, kita juga boleh menggunakan fungsi Callers(skip int, pc []uintptr) int untuk mengembalikan pembilang program pada tindanan semasa dan maklumat laluan lengkap semua fungsi pada laluan panggilan tindanan semasa. Inilah yang kita panggil fungsi timbunan panggilan.

Apabila memanggil fungsi, kita boleh menggunakan Caller jika perlu untuk mendapatkan maklumat fungsi pada laluan panggilan pada tindanan semasa. Sebagai contoh, apabila pengecualian berlaku, kita boleh mencetak maklumat panggilan fungsi pada tindanan semasa untuk mencari ralat kod dengan lebih baik. Kod sampel adalah seperti berikut:

package main

import (
    "fmt"
    "runtime"
)

func testA() {
    testB()
}

func testB() {
    _, file, line, _ := runtime.Caller(0)
    fmt.Println(file, line)
}

func main() {
    testA()
}

Dalam contoh ini, kami memanggil fungsi testA, yang seterusnya memanggil fungsi testB. Akhir sekali, kami mencetak maklumat panggilan fungsi melalui fungsi testB dalam fungsi Caller.

ID Goroutine

Di Golang, ID Goroutine ialah pengecam unik setiap Goroutine, iaitu nombor uint64. Kami boleh mendapatkan ID Goroutine semasa apabila program berjalan, dan kemudian mencetaknya untuk nyahpepijat dan lokasi ralat.

Di Golang, kita boleh menggunakan fungsi runtime dalam pakej GetGoID() untuk mendapatkan ID Goroutine semasa Kod sampel adalah seperti berikut:

package main

import (
    "fmt"
    "runtime"
)

func test() {
    fmt.Println("Goroutine ID:", runtime.GetGoID())
}

func main() {
    go test()
    fmt.Println("main Goroutine ID:", runtime.GetGoID())
    for {}
}

Dalam contoh ini, kita berada dalam main Coroutine (iaitu Goroutine) dimulakan dalam fungsi, dan fungsi test dipanggil dalam coroutine, dan akhirnya maklumat ID Goroutine semasa dicetak.

Stacktrace

Dalam pembangunan aplikasi sebenar, kita sering menghadapi beberapa masalah yang lebih kompleks, seperti kebuntuan, kebocoran memori, dsb. Jika kami boleh mendapatkan maklumat rangkaian panggilan fungsi yang lengkap pada masa ini, kami boleh mencari dengan lebih baik di mana masalah ini berlaku dan dengan itu menyelesaikan masalah dengan lebih baik.

Di Golang, kita boleh mendapatkan maklumat rangkaian panggilan fungsi yang lengkap dengan menggunakan kaedah Stacktrace. Ini memerlukan penggunaan perpustakaan pihak ketiga, seperti go-spew, logrus, dsb. Kod sampel adalah seperti berikut:

package main

import (
    "fmt"
    "github.com/davecgh/go-spew/spew"
    "github.com/sirupsen/logrus"
)

func testC() {
    log := logrus.New()
    log.Out = nil

    trace := spew.Sdump(string(debug.Stack()))
    fmt.Println(trace)
}

func testB() {
    testC()
}

func testA() {
    testB()
}

func main() {
    testA()
}

Dalam contoh ini, kami memperoleh maklumat rangkaian panggilan fungsi lengkap pada tindanan semasa dengan menggunakan fungsi debug.Stack(), dan kemudian mencetak maklumat ini melalui perpustakaan logrus . Pada masa yang sama, kami juga menukar maklumat ini ke dalam bentuk rentetan melalui fungsi spew.Sdump() untuk paparan dan kedudukan yang lebih baik.

Ringkasan:

Dalam pembangunan aplikasi Golang, kita sering tidak dapat tidak menghadapi pengesanan dan kedudukan rantai panggilan fungsi Pada masa ini, kita perlu menguasai beberapa kemahiran, seperti fungsi tindanan panggilan, Goroutine ID, Stacktrace, dsb. Teknik ini boleh membantu kami menyelesaikan masalah dengan lebih baik dan meningkatkan kecekapan pembangunan dan kualiti kod kami.

Atas ialah kandungan terperinci Kemahiran mengesan rantai panggilan fungsi Golang. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn