GNU/Linux >> Belajar Linux >  >> Linux

Cetak nilai penunjuk tumpukan

Salah satu trik, yang tidak portabel atau bahkan dijamin berhasil, adalah dengan mencetak alamat lokal sebagai pointer.

void print_stack_pointer() {
  void* p = NULL;
  printf("%p", (void*)&p);
}

Ini pada dasarnya akan mencetak alamat p yang merupakan perkiraan yang baik dari penunjuk tumpukan saat ini


Tidak ada cara portabel untuk melakukannya.

Di GNU C, ini mungkin berfungsi untuk ISA target yang memiliki register bernama SP, termasuk x86 di mana gcc mengenali "SP" sebagai kependekan dari ESP atau RSP.

// broken with clang, but usually works with GCC
register void *sp asm ("sp");
printf("%p", sp);

Penggunaan variabel register lokal ini sekarang tidak digunakan lagi oleh GCC:

Satu-satunya penggunaan yang didukung untuk fitur ini adalah untuk menentukan register untuk operan input dan output saat memanggil Extended asm

Mendefinisikan variabel register tidak mencadangkan register. Selain saat menjalankan Extended asm, isi register yang ditentukan tidak dijamin. Untuk alasan ini, penggunaan berikut secara eksplisit tidak didukung. Jika tampaknya berhasil, itu hanya kebetulan , dan mungkin berhenti berfungsi sebagaimana dimaksud karena (tampaknya) perubahan yang tidak terkait pada kode sekitarnya, atau bahkan perubahan kecil dalam pengoptimalan versi gcc yang akan datang. ...

Ini juga rusak dalam praktiknya dengan dentang di mana sp diperlakukan seperti variabel lain yang tidak diinisialisasi.


Selain jawaban duedl0r dengan GCC khusus Anda bisa menggunakan __builtin_frame_address(0) yang spesifik untuk GCC (namun bukan x86 spesifik).

Ini juga harus bekerja pada Dentang (tetapi ada beberapa bug tentangnya).

Mengambil alamat lokal (seperti yang dijawab JaredPar) juga merupakan solusi.

Perhatikan bahwa AFAIK standar C tidak memerlukan tumpukan panggilan apa pun secara teori.

Orang bisa memimpikan teknik lain. Dan Anda dapat membagi tumpukan (setidaknya pada GCC baru-baru ini), dalam hal ini gagasan tentang penunjuk tumpukan kurang masuk akal (karena tumpukan tidak bersebelahan, dan dapat dibuat dari banyak segmen dari beberapa bingkai panggilan masing-masing) .


Linux
  1. Nilai Maksimum Id Proses?

  2. Ny Cara Mencetak Nilai Di Dalam Variabel Di Dalam Kutipan Tunggal?

  3. Bagaimana Cara Mencetak Baris Nomor 15 Dan 25 Dari Setiap 50 Baris?

  1. Cara mencetak pthread_t

  2. cetak tumpukan panggilan dalam C atau C++

  3. Bagaimana cara mendapatkan jejak tumpukan untuk C++ menggunakan gcc dengan informasi nomor baris?

  1. Waktu Habis Dalam Skrip Shell?

  2. Mencegah C integer overflow

  3. Bisakah Anda mendapatkan program apa pun di Linux untuk mencetak jejak tumpukan jika itu segfault?