Program yang berperilaku berbeda dalam / keluar dari debugger [ditutup]

18

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.

Spraff
sumber
4
Beberapa debugger mengeluarkan teks yang berbeda pada saat startup ke compiler normal, sehingga setiap program tampaknya memenuhi persyaratan ini. Apakah itu masuk hitungan?
Wheat Wizard
1
Bukankah semua output berasal dari debugger? Tidak jelas bagi saya apa output debugger vs output program jika kita membuat perbedaan.
Wheat Wizard
5
Tentukan debugger?
Artemis mendukung Monica
3
Apa yang Anda maksud dengan debugger? Yang mana?
MilkyWay90
6
Bagaimana Anda mendefinisikan debugger? Jika penerjemah bahasa mendukung mode "debug" (yang, katakanlah, memperkenalkan perintah tidak standar), apakah itu diperhitungkan?
Buah Esolanging

Jawaban:

31

bahasa mesin x86 dan x64_64 di Linux dan OSX, 1 byte

0x0:  CC    int3 

Cobalah online!

int 3melempar SIGTRAPyang 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 11 9 byte

main=204;

Cobalah online!

Integer 204sesuai dengan int 3instruksi; tautan TIO sama seperti di atas.

plafon
sumber
1
tugas yang jelas dalam kode C, belum pernah melihat itu sebelumnya.
Tom
4
Sebenarnya SIGTRAPtidak menghasilkan SIGABRT, jadi bagian tentang menelepon abort()itu salah. Sama sekali tidak ada penangan sinyal default SIGTRAP, sehingga kernel menghentikan proses (dan orang tua dapat menggunakannya WIFSIGNALEDuntuk mendeteksi ini dan WTERMSIGuntuk menentukan sinyal mana yang terjadi).
Ruslan
9

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:

IDE REPL

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:

Dialog runtime

Adm
sumber
9

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.

for(console.log(a={},i=99);--i;a=a.a={k:new Int8Array(1e9)});alert(1)

Caranya: Ketika debugger diaktifkan dengan consoletab diaktifkan. console.logmemungkinkan kebocoran memori, dan program akan segera kehabisan memori. Ketika debugger dinonaktifkan, GC akan menghapus memori yang dialokasikan, dan Anda akan melihat peringatan dengan teks 1akhirnya.

tsh
sumber
8

MSVC (64-bit), 50 35 byte

main(){return IsDebuggerPresent();}

Keluar 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.

Neil
sumber
1
Apakah MSVC memerlukan prototipe? Anda mungkin ingin mencoba dengan MinGW dalam mode C89, untuk menyimpan beberapa byte.
Ruslan
@Ruslan Bah, menunjukkan sudah berapa lama sejak saya menggunakan C ...
Neil
7

T-SQL, 6 byte

sp_who

Selalu mengembalikan baris tambahan di bawah nama pengguna yang mengeksekusi ketika debugger aktif.

Anda bisa menjangkauku
sumber
5

Python, 29 byte

import sys
sys.modules['pdb']

Tanpa debugger ( python3 /tmp/foo.py):

Traceback (most recent call last):
  File "/tmp/foo.py", line 2, in <module>
    sys.modules['pdb']
KeyError: 'pdb'

Dengan debugger ( python3 -m pdb /tmp/foo.py):

(empty output)

karena pdbdimuat ke modul aplikasi-terlihat dalam kasus kedua.

viraptor
sumber
4

JavaScript, 17 byte

debugger
alert(1)

debugger menghentikan eksekusi jika konsol debugger terbuka, selain itu tidak melakukan apa-apa

Jonatjano
sumber
4

Java, 131 102 100 byte

v->(java.lang.management.ManagementFactory.getRuntimeMXBean().getInputArguments()+"").split(":jdwp")

Saat 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 toStringitu bodoh ketika saya dapat membiarkan Java secara implisit mengkonversi

-2 byte terima kasih kepada Benjamin Urquhart untuk mengubah tipe pengembalian

Menyodok
sumber
3
Anda dapat mempersingkat menggunakan lambda. Juga, sangat mungkin bahwa Anda hanya dapat menguji pada :jdwp, bukan -agentlib:jdwp. The :adalah untuk membedakan runjdwpdari -agentlib:jdwp. 108 byte
Olivier Grégoire
2
103 byte
Benjamin Urquhart
2
@BenjaminUrquhart Saya merasa bodoh karena melewatkan toStringperangkat tambahan di sini. Tangkapan yang bagus!
Poke
100 byte - mengembalikan array dengan panjang 1 ketika tidak ada debugger aktif, array dengan panjang minimal 2 jika ada.
Benjamin Urquhart
3

Robotalk , 22 byte

debug l: chronon l ifg

Jika debugger aktif, debuginstruksi 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.

Menandai
sumber
2

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

feature('IsDebugMode')

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.

Tom Carpenter
sumber