Tantangannya adalah untuk menulis program deterministik (bahasa / OS apa pun) yang tidak menggunakan argumen atau input lain dan berperilaku berbeda dalam debugger dari bagaimana ia berperilaku ketika tidak sedang di-debug. .
Misalnya, program dapat menampilkan sesuatu saat sedang di-debug tetapi tidak menghasilkan apa-apa saat tidak di-debug. Atau menampilkan sesuatu yang berbeda di setiap kasus. Atau mungkin macet ketika sedang di-debug tapi tidak macet saat tidak di-debug. Atau sebaliknya.
Peringatan dan klarifikasi:
- Perbedaan waktu tidak dihitung.
- Bahasa yang ditafsirkan diizinkan.
- Untuk menekankan determinisme: perilaku harus benar-benar dapat direproduksi baik di dalam maupun di luar konteks debugging.
- Kehadiran debugger itu sendiri harus menjadi satu-satunya perbedaan antara dua kasus.
- Memberitahu debugger untuk menambahkan input (stdin atau argv ENV atau apa pun) curang, debugger harus menjalankan program "apa adanya".
- Mengubah lingkungan (misalnya berjalan di mesin virtual atau OS yang berbeda, atau mengubah pengaturan OS seperti batas memori) antara proses debug dan non-debug tidak diizinkan.
Kode terpendek menang. Saya dapat memberikan hadiah yang mengungkapkan sesuatu yang menarik tentang cara kerja debuggers.
Jawaban:
bahasa mesin x86 dan x64_64 di Linux dan OSX, 1 byte
Cobalah online!
int 3
melemparSIGTRAP
yang akan menyebabkan debugger berhenti seolah-olah menemukan breakpoint. Di luar debugger, kernel mengakhiri proses (terima kasih kepada @Ruslan untuk koreksi).C (gcc) (x86 Linux dan OSX),
14 119 byteCobalah online!
Integer
204
sesuai denganint 3
instruksi; tautan TIO sama seperti di atas.sumber
SIGTRAP
tidak menghasilkanSIGABRT
, jadi bagian tentang meneleponabort()
itu salah. Sama sekali tidak ada penangan sinyal defaultSIGTRAP
, sehingga kernel menghentikan proses (dan orang tua dapat menggunakannyaWIFSIGNALED
untuk mendeteksi ini danWTERMSIG
untuk menentukan sinyal mana yang terjadi).APL (Dyalog Unicode) , 0 byte
Dalam Dyalog APL, debugger vs no debugger dipilih dengan menjalankan ruang kerja seseorang baik dalam juru bahasa IDE atau juru bahasa runtime.
Memuat ruang kerja pengaturan default yang benar-benar kosong ke juru bahasa IDE, segera menjatuhkan pengguna ke mode REPL karena aplikasi harus secara aktif mematikan juru bahasa untuk keluar:
Namun, penerjemah runtime tidak memiliki mode REPL, dan jadi jika aplikasi berakhir (misalnya karena benar-benar kosong) dan tidak secara eksplisit mematikan penerjemah, maka secara implisit telah berusaha mencapai mode REPL (" Sesi APL "), dan mengeluh:
sumber
JavaScript di Firefox, 69 byte
PERINGATAN : Skrip ini dapat menggantung browser Anda! JANGAN mengujinya dengan browser lain (misalnya Chrome) karena dapat merusak tab / browser Anda.
Caranya: Ketika debugger diaktifkan dengan
console
tab diaktifkan.console.log
memungkinkan kebocoran memori, dan program akan segera kehabisan memori. Ketika debugger dinonaktifkan, GC akan menghapus memori yang dialokasikan, dan Anda akan melihat peringatan dengan teks1
akhirnya.sumber
MSVC (64-bit),
5035 byteKeluar dengan kode 0 secara normal tetapi 1 di bawah debugger (perhatikan bahwa WinDbg tidak secara otomatis menampilkan kode keluar tetapi Anda dapat memalsukannya dengan memeriksa tumpukan). Sunting: Disimpan 15 byte berkat @Ruslan.
sumber
T-SQL, 6 byte
Selalu mengembalikan baris tambahan di bawah nama pengguna yang mengeksekusi ketika debugger aktif.
sumber
Python, 29 byte
Tanpa debugger (
python3 /tmp/foo.py
):Dengan debugger (
python3 -m pdb /tmp/foo.py
):karena
pdb
dimuat ke modul aplikasi-terlihat dalam kasus kedua.sumber
JavaScript, 17 byte
debugger
menghentikan eksekusi jika konsol debugger terbuka, selain itu tidak melakukan apa-apasumber
Java,
131 102100 byteSaat berjalan tanpa debugger, fungsi ini mengembalikan array dengan panjang 1. Saat menjalankan dengan debugger, ini mengembalikan array dengan panjang 2 (lebih besar dari 1).
Cobalah online!
Ini secara teknis mendeteksi jika Anda bisa melampirkan debugger; tidak jika ada yang terhubung ... Tidak yakin apakah itu valid
-23 byte terima kasih kepada Olivier Grégoire karena menyebutkan bahwa saya dapat mengurangi apa yang saya cari dalam parameter runtime dan untuk lambda-izing jawaban saya
-5 byte terima kasih kepada Benjamin Urquhart karena mencatat bahwa panggilan
toString
itu bodoh ketika saya dapat membiarkan Java secara implisit mengkonversi-2 byte terima kasih kepada Benjamin Urquhart untuk mengubah tipe pengembalian
sumber
:jdwp
, bukan-agentlib:jdwp
. The:
adalah untuk membedakanrunjdwp
dari-agentlib:jdwp
. 108 bytetoString
perangkat tambahan di sini. Tangkapan yang bagus!Robotalk , 22 byte
Jika debugger aktif,
debug
instruksi menghentikan sementara eksekusi hingga akhir dari tick game saat ini. Dalam hal ini, variabel "chronon" selalu 1 atau lebih besar ketika dibaca, dan program mengeksekusi loop tak terbatas. Jika debugger tidak aktif,debug
adalah no-cycle satu siklus. "Chronon" sekarang 0 saat dibaca, cabang "ifg" tidak diambil, dan eksekusi mencapai akhir kode, yang merupakan kondisi kesalahan.sumber
MATLAB, 6 byte
dbquit
Ketika berhenti di debugger, ini akan keluar dari mode debugging.
Ketika tidak sedang di-debug, itu akan mencetak pesan kesalahan yang tidak bisa digunakan ketika tidak berhenti di debugger.
Perlu dicatat ini hanya berfungsi untuk evaluasi di jendela perintah (salah satu dari tiga cara menjalankan kode MATLAB). Ini tidak akan berfungsi dalam fungsi atau skrip karena begitu Anda mencoba menjalankan skrip atau fungsi, Anda berhenti berada dalam mode debug selama eksekusi.
Yang paling dekat dengan sesuatu yang akan dijalankan dalam suatu fungsi / skrip adalah:
MATLAB, 22 byte
Ini adalah perintah tidak berdokumen di MATLAB. Jika Anda berhenti di debugger dalam skrip atau fungsi, dan kemudian memanggil fungsi lain (atau evaluasi perintah) yang berisi baris di atas, itu akan mengembalikan true.
Di luar debugger itu akan mengembalikan false.
Namun jika Anda hanya menjalankan skrip / fungsi yang berisi di atas, bahkan jika Anda menambahkan breakpoint di awal skrip / fungsi dan melangkah melalui, itu akan kembali salah, karena sekali lagi, setelah Anda mulai menjalankan Anda berhenti berada di debugger sementara.
sumber