Apakah kepentingan 'Medan tidak diketahui' dalam surih tindanan panik Go, dan bagaimanakah kita boleh menyahkod hujah dalam surih balik?

Barbara Streisand
Lepaskan: 2024-11-06 18:04:02
asal
131 orang telah melayarinya

What is the significance of the

Menyelidiki Medan Tidak Diketahui dalam Jejak Tindanan Panik

Menghadapi "Medan tidak diketahui dalam jejak tindanan panik" yang membingungkan adalah perkara biasa apabila menyahpepijat ralat panik dalam Go. Untuk merungkai enigma ini, mari kita mendalami kerumitan surih tindanan.

Dalam coretan kod yang disediakan:

package main

func F(a int) {
    panic(nil)
}

func main() {
    F(1)
}
Salin selepas log masuk

Menjalankan atur cara mendedahkan surih tindanan panik:

panic: nil

goroutine 1 [running]:
main.F(0x1, 0x10436000)
    /tmp/sandbox090887108/main.go:4 +0x20
main.main()
    /tmp/sandbox090887108/main.go:8 +0x20
Salin selepas log masuk

Apakah kepentingan nilai samar 0x10436000 yang disebut bersama F(0x1)?

Misteri Terbongkar

Nilai 0x10436000 bukan hujah kedua kepada fungsi tersebut. Sebaliknya, ia mewakili nilai data mentah yang dihantar sebagai argumen pertama, dinyatakan sebagai nilai bersaiz penunjuk. Ini adalah hasil daripada seni bina taman permainan, yang menampilkan saiz perkataan 64-bit tetapi penunjuk 32-bit (GOARCH=amd64p32).

Menyahkod Argumen

Dalam fail traceback.go, nilai dicetak dengan mengakses argumen secara berulang berdasarkan saiz penunjuknya:

for i := uintptr(0); i < frame.arglen/sys.PtrSize; i++ {
Salin selepas log masuk

Ini bermakna memandangkan saiz perkataan adalah dua kali ganda saiz penunjuk di taman permainan, pasangan nilai dicetak dalam setiap argumen bingkai.

Contoh untuk Kejelasan

Untuk menggambarkan lebih lanjut:

  • Pertimbangkan fungsi berikut:
func F(a uint8) {
    panic(nil)
}
Salin selepas log masuk

Memanggil keputusan F(1) dalam:

main.F(0x97301, 0x10436000)
Salin selepas log masuk

Hanya 8 bit pertama perkataan 64-bit digunakan (1 dalam kes ini), manakala bakinya tidak digunakan.

  • Pada sistem amd64, fungsi dengan tiga argumen uint32 akan menghasilkan surih tindanan:
main.F(0x100000001, 0xc400000001)
Salin selepas log masuk

Tiga argumen menduduki dua perkataan dan nilai tambahan yang tidak digunakan dicetak.

  • Fungsi dengan nilai pulangan juga memperuntukkan ruang pada tindanan, seperti yang ditunjukkan oleh:
func F(a int64) (int, int)
Salin selepas log masuk

Pada amd64, argumen bingkai tindanan akan muncul sebagai:

main.F(0xa, 0x1054d60, 0xc420078058)
Salin selepas log masuk

Perkataan pertama adalah untuk hujah, manakala dua lagi adalah untuk nilai pulangan yang tidak dimulakan.

Atas ialah kandungan terperinci Apakah kepentingan 'Medan tidak diketahui' dalam surih tindanan panik Go, dan bagaimanakah kita boleh menyahkod hujah dalam surih balik?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:php.cn
Kenyataan Laman Web ini
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
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan
Tentang kita Penafian Sitemap
Laman web PHP Cina:Latihan PHP dalam talian kebajikan awam,Bantu pelajar PHP berkembang dengan cepat!