Dalam Visual Studio, kita semua memiliki "baadf00d", telah melihat "CC" dan "CD" ketika memeriksa variabel dalam debugger di C ++ selama run-time.
Dari apa yang saya mengerti, "CC" dalam mode DEBUG hanya untuk menunjukkan kapan memori baru () atau mengalokasikan () dan disatukan. Sedangkan "CD" mewakili memori yang dihapus atau yang bebas. Saya hanya melihat "baadf00d" di RELEASE build (tapi saya mungkin salah).
Sekali-sekali, kita masuk ke situasi mengatasi kebocoran memori, buffer overflows, dll dan informasi seperti ini sangat berguna.
Apakah seseorang akan berbaik hati untuk menunjukkan kapan dan dalam mode apa memori diatur ke pola byte yang dikenali untuk tujuan debugging?
debugging
visual-c++
HidekiAI
sumber
sumber
Jawaban:
Tautan ini memiliki informasi lebih lanjut:
http://en.wikipedia.org/wiki/Magic_number_(programming)
sumber
BAADF00D
(makanan buruk),BEEFCACE
(kue daging sapi),BAADCAB1E
(kabel buruk),BADCAFE
(kafe buruk), danDEADDEAD
(mati mati). Apakah ini disengaja?0xDEADBEEF
,0xC0EDBABE
juga klasik bahkan jika mereka tidak termasuk dalam bahasa MSBEA71E5
Sebenarnya ada sedikit informasi berguna yang ditambahkan ke alokasi debug. Tabel ini lebih lengkap:
http://www.nobugs.org/developer/win32/debug_crt_heap.html#table
sumber
Mengenai
0xCC
dan0xCD
khususnya, ini adalah peninggalan dari Intel 8088 / 8086 instruksi prosesor set kembali pada 1980-an.0xCC
adalah kasus khusus dari opcode interupsi perangkat lunak . Versi byte tunggal khusus memungkinkan program untuk menghasilkan interrupt 3 .INT
0xCD
0xCC
Meskipun angka interupsi perangkat lunak, pada prinsipnya, arbitrer,
INT 3
secara tradisional digunakan untuk fungsi debugger break atau breakpoint , sebuah konvensi yang masih ada hingga hari ini. Setiap kali debugger diluncurkan, ia menginstal interrupt handler untukINT 3
sedemikian rupa sehingga ketika opcode dijalankan, debugger akan terpicu. Biasanya itu akan menghentikan sementara pemrograman yang sedang berjalan dan menampilkan prompt interaktif.Biasanya,
INT
opcode x86 adalah dua byte:0xCD
diikuti oleh angka interupsi yang diinginkan dari 0-255. Sekarang meskipun Anda bisa mengeluarkan0xCD 0x03
untukINT 3
, Intel memutuskan untuk menambahkan khusus sebuah version--0xCC
tanpa byte tambahan - karena opcode harus hanya satu byte untuk fungsi sebagai 'mengisi byte' yang handal untuk memori yang tidak terpakai.Intinya di sini adalah untuk memungkinkan pemulihan yang anggun jika prosesor keliru melompat ke memori yang tidak mengandung instruksi yang dimaksud . Instruksi multi-byte tidak cocok untuk tujuan ini karena lompatan yang salah dapat mendarat pada byte byte yang mungkin di mana ia harus melanjutkan dengan aliran instruksi yang dibentuk dengan benar.
Jelas, satu-byte opcodes bekerja sepele untuk ini, tetapi bisa juga ada pengecualian unik: misalnya, mengingat urutan pengisian
0xCDCDCDCD
(juga disebutkan pada halaman ini), kita dapat melihat bahwa itu cukup dapat diandalkan karena di mana pun penunjuk instruksi mendarat ( kecuali mungkin byte terisi terakhir), CPU dapat melanjutkan mengeksekusi instruksi dua-byte x86 yang validCD CD
, dalam hal ini untuk menghasilkan interupsi perangkat lunak 205 (0xCD).Lebih aneh lagi, sedangkan
CD CC CD CC
100% dapat ditafsirkan - memberikan salah satuINT 3
atauINT 204
- urutanCC CD CC CD
kurang dapat diandalkan, hanya 75% seperti yang ditunjukkan, tetapi umumnya 99,99% ketika diulang sebagai pengisi memori ukuran int.Referensi Makro Assembler , 1987
sumber
NOP
? Bukankah memasukkan satu0xCC
byte dengan perintaheb
(enter bytes) sudah cukup?