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

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

Patricia Arquette
Lepaskan: 2024-11-05 00:08:02
asal
794 orang telah melayarinya

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>
Salin selepas log masuk

menghasilkan:

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

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>
Salin selepas log masuk

Surih tindanan yang terhasil menunjukkan:

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

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>
Salin selepas log masuk

dipanggil dengan:

<code class="go">F(1, 1, 1)</code>
Salin selepas log masuk

jejak tindanan menunjukkan:

main.F(0x100000001, 0xc400000001)
Salin selepas log masuk

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>
Salin selepas log masuk

Pada amd64, argumen bingkai tindanan akan muncul sebagai:

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

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!

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