Semasa menganalisis surih tindanan daripada panik, seseorang mungkin menemui nombor yang tidak dikenali mengikut nama fungsi. Sebagai contoh, menjalankan kod berikut:
<code class="go">package main func F(a int) { panic(nil) } func main() { F(1) }</code>
menghasilkan:
panic: nil goroutine 1 [running]: main.F(0x1, 0x10436000) /tmp/sandbox090887108/main.go:4 +0x20 main.main() /tmp/sandbox090887108/main.go:8 +0x20
Nombor kedua (0x10436000) mungkin kelihatan membingungkan. Untuk menyahkodnya, kita mesti menyelidiki sifat data surih tindanan.
Data yang dicetak dalam surih tindanan terdiri daripada argumen fungsi. Walau bagaimanapun, nilai ini tidak sepadan secara langsung dengan hujah yang dihantar. Sebaliknya, nilai tersebut mewakili data mentah yang disimpan dalam ingatan, khususnya dalam nilai bersaiz penunjuk.
Dalam persekitaran Taman Permainan, situasi unik timbul. Seni bina perkataan 64-bitnya mempunyai penunjuk 32-bit (GOARCH=amd64p32). Akibatnya, setiap kali argumen fungsi dicetak, perkara berikut berlaku:
Pertimbangkan fungsi berikut panggil:
<code class="go">F(1)</code>
Surih tindanan yang terhasil menunjukkan:
main.F(0x97301, 0x10436000)
Dalam kes ini, hujah uint8 (1) hanya menduduki 8 bit pertama perkataan 64-bit (0x97301 & 0x0f). 0x97300 tambahan dan keseluruhan 0x10436000 mewakili bahagian perkataan yang tidak digunakan.
Untuk fungsi yang lebih kompleks, seperti:
<code class="go">func F(a, b, c uint32)</code>
dipanggil dengan:
<code class="go">F(1, 1, 1)</code>
jejak tindanan menunjukkan:
main.F(0x100000001, 0xc400000001)
kerana tiga nilai 32-bit menduduki dua perkataan.
Nilai pulangan juga diperuntukkan pada tindanan, seperti yang dilihat dalam fungsi berikut:
<code class="go">func F(a int64) (int, int)</code>
Pada amd64, argumen bingkai tindanan akan muncul sebagai:
main.F(0xa, 0x1054d60, 0xc420078058)
dengan satu perkataan untuk input dan dua untuk nilai pulangan . Ambil perhatian bahawa nilai pulangan tidak dimulakan, jadi maklumat ini adalah penggunaan terhad.
Atas ialah kandungan terperinci Apakah yang diwakili oleh 'Medan Tidak Diketahui' dalam Jejak Tindanan Panik?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!