Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Apakah yang diwakili oleh "Medan Tidak Diketahui" dalam Jejak Tindanan Panik?

Apakah yang diwakili oleh "Medan Tidak Diketahui" dalam Jejak Tindanan Panik?

Patricia Arquette
Patricia Arquetteasal
2024-11-05 00:08:02708semak imbas

What does the

Memahami "Medan Tidak Diketahui" dalam Surih Tindanan Panik

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.

Menyahkod Nombor Tambahan

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:

  • Saiz perkataan adalah dua kali lebih besar daripada saiz penunjuk, membawa kepada bilangan nilai genap dicetak dalam argumen bingkai .
  • Hanya 32 bit pertama perkataan 64-bit digunakan, meninggalkan bit yang selebihnya tidak digunakan.

Contoh Data Hujah

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.

Pulangan Nilai dalam Bingkai Tindanan

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!

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