Hata ayıklayıcının içine / dışına farklı davranan program [kapalı]


18

Zorluk, herhangi bir argüman veya başka girdi almayan ve hata ayıklayıcıda hata ayıklanmadığında nasıl davrandığından farklı davranan deterministik bir program (herhangi bir dil / işletim sistemi) yazmaktır .

Örneğin, program hata ayıklandığında bir şey çıktısı verebilir, ancak hata ayıklanmadığında hiçbir şey çıktısı veremez. Veya her durumda farklı bir şey çıktılayın. Veya hata ayıklandığında çökebilir, ancak hata ayıklanmadığında çökmeyebilir. Ya da tam tersi.

Uyarılar ve açıklamalar:

  • Zamanlama farklılıkları dikkate alınmaz.
  • Yorumlanan dillere izin verilir.
  • Determinizm vurgulamak için: davranış hata ayıklama bağlamında ve dışında tam olarak tekrarlanabilir olmalıdır.
  • Hata ayıklayıcının varlığı iki durum arasındaki tek fark olmalıdır.
    • Hata ayıklayıcıya girdi (stdin veya argv ENV veya başka bir yöntem) eklemesini söyleyen hile, hata ayıklayıcı programı "olduğu gibi" çalıştırmalıdır.
    • Hata ayıklama ve hata ayıklama olmayan çalıştırmalar arasında ortamın değiştirilmesine (örneğin, sanal bir makinede veya farklı bir işletim sisteminde çalıştırılmasına veya bellek sınırları gibi işletim sistemi ayarlarını değiştirmeye) izin verilmez.

En kısa kod kazanır. Hata ayıklayıcıların nasıl çalıştığı hakkında ilginç bir şey ortaya koyan bir ödül verebilirim.


4
Bazı hata ayıklayıcılar normal derleyiciye başlangıçta farklı metinler çıkarır, bu nedenle herhangi bir program bu koşulları karşılar gibi görünür. Bu sayılır mı?
Post Rock Garf Hunter

1
Tüm çıktılar hata ayıklayıcıdan gelmiyor mu? Bir ayırım yapıyorsak, program çıktısı ile program çıktısı arasındaki farkın ne olduğu net değil.
Rock Garf Hunter Post

5
Hata ayıklayıcı tanımlansın mı?
Artemis hala

3
Hata ayıklayıcı ile ne demek istiyorsun? Hangisi?
MilkyWay90

6
Bir hata ayıklayıcıyı nasıl tanımlarsınız? Bir dil tercümanı "hata ayıklama" modunu destekliyorsa (standart olmayan komutlar getirir), bu geçerli midir?
Esolanging Fruit

Yanıtlar:


31

Linux ve OSX'te x86 ve x64_64 makine dili, 1 bayt

0x0:  CC    int3 

Çevrimiçi deneyin!

int 3SIGTRAPbir hata ayıklayıcının bir kesme noktasıyla karşılaşmış gibi durmasına neden olacak bir atar . Bir hata ayıklayıcının dışında, çekirdek işlemi sonlandırır (düzeltme için @Ruslan'a teşekkürler).

C (gcc) (x86 Linux ve OSX), 14 11 9 bayt

main=204;

Çevrimiçi deneyin!

Tam sayı talimata 204karşılık gelir int 3; TIO bağlantısı yukarıdaki ile aynıdır.


1
C kodundaki atamayı temizle, daha önce görmedim.
Tom

4
Aslında SIGTRAPyol açmaz SIGABRTarama hakkında parçası, böylece abort()yanlış. Bunun için varsayılan bir sinyal işleyici yoktur SIGTRAP, bu nedenle çekirdek işlemi sonlandırır (ve ebeveyn bunu WIFSIGNALEDalgılamak ve WTERMSIGhangi sinyalin meydana geldiğini belirlemek için kullanabilir ).
Ruslan

9

APL (Dyalog Unicode) , 0 bayt

Dyalog APL'de, hata ayıklayıcıya karşı hata ayıklayıcı, kişinin çalışma alanını IDE yorumlayıcısında veya çalışma zamanı yorumlayıcısında çalıştırarak seçilir.

IDE yorumlayıcısına tamamen boş bir varsayılan ayarlar çalışma alanı yüklendiğinde, uygulamaların bırakması için uygulamaların yorumlayıcıyı aktif olarak kapatması gerektiğinden kullanıcıyı hemen REPL moduna bırakır:

IDE REPL

Ancak, çalışma zamanı yorumlayıcısının bir REPL modu yoktur ve bu nedenle bir uygulama sona ererse (örneğin tamamen boş olduğu için) ve yorumlayıcıyı açıkça kapatmazsa, dolaylı olarak REPL moduna erişmeye çalışır (" APL oturumu ") ve şikayet ediyor:

Çalışma zamanı iletişim kutusu


9

Firefox'ta JavaScript, 69 bayt

UYARI : Bu komut dosyası tarayıcınızı asabilir! Sekmenizi / tarayıcınızı kilitleyebileceğinden diğer tarayıcılarla (ör. Chrome) test ETMEYİN.

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

Nasıl: Hata ayıklayıcı consolesekme etkinken etkinleştirildiğinde. console.logbellek sızıntısını mümkün kılar ve programın belleği yakında biter. Hata ayıklayıcı devre dışı bırakıldığında GC, ayrılan belleği temizler ve 1sonunda metin içeren bir uyarı görürsünüz .


8

MSVC (64 bit), 50 35 bayt

main(){return IsDebuggerPresent();}

Hata ayıklayıcının altında normalde 0 ancak 1 koduyla çıkar (WinDbg'nin çıkış kodunu otomatik olarak göstermediğini, ancak yığını inceleyerek sahte yapabileceğinizi unutmayın). Düzenleme: @Ruslan sayesinde 15 bayt kaydedildi.


1
MSVC prototip gerektiriyor mu? Daha sonra bazı baytları kaydetmek için Min89'u C89 modunda denemek isteyebilirsiniz.
Ruslan

@Ruslan Bah, C'yi kullanmamın ne kadar sürdüğünü gösteriyor ...
Neil

7

T-SQL, 6 bayt

sp_who

Hata ayıklayıcı etkinken her zaman çalışan kullanıcının adı altında fazladan bir satır döndürür.


5

Python, 29 bayt

import sys
sys.modules['pdb']

Hata ayıklayıcı ( python3 /tmp/foo.py) olmadan :

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

Hata ayıklayıcı ( python3 -m pdb /tmp/foo.py) ile:

(empty output)

çünkü pdbikinci durumda uygulama tarafından görülebilir bir modüle yüklenir.


4

JavaScript, 17 bayt

debugger
alert(1)

debugger hata ayıklayıcı konsolu açıksa yürütmeyi durdurur, aksi takdirde hiçbir şey yapmaz


4

Java, 131102100 bayt

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

Hata ayıklayıcı olmadan çalışırken bu işlev bir uzunluk dizisi 1 döndürür. Bir hata ayıklayıcı ile çalışırken, bu uzunluk 2 (1'den büyük) bir dizi döndürür.

Çevrimiçi deneyin!

Eğer bu teknik olarak algılar olabilir bir hata ayklayc; şu anda bağlıysa değil ... Geçerli olduğundan emin değilim

Olivier Grégoire'a çalışma zamanı parametrelerinde aradığım şeyi kısabileceğimi ve cevabımı lambdaize ettiğim için bahsettiği için -23 bayt teşekkürler

Java dolaylı dönüştürmesine izin verdiğimde, çağrıların aptal olduğunu belirten Benjamin Urquhart sayesinde -5 bayttoString

Dönüş türünü değiştirdiği için Benjamin Urquhart sayesinde -2 bayt


3
Bir lambda kullanarak kısaltabilirsiniz. Ayrıca, bunun :jdwpyerine yalnızca test yapabilmeniz çok olasıdır -agentlib:jdwp. :Ayırt etmektir runjdwpdan -agentlib:jdwp. 108 bayt
Olivier Grégoire


2
@BenjaminUrquhart toStringBuradaki geliştirmeyi kaçırdığım için aptal hissediyorum . İyi yakalama!
Poke

100 bayt - hiçbir hata ayıklayıcı etkin değilken uzunluk 1 dizisini, varsa hata en az 2 uzunluk dizisini döndürür.
Benjamin Urquhart

3

Robotalk , 22 bayt

debug l: chronon l ifg

Hata ayıklayıcı etkinse, debugtalimat geçerli oyun işaretinin sonuna kadar yürütmeyi duraklatır. Bu durumda, "chronon" değişkeni okunduğunda her zaman 1 veya daha büyüktür ve program sonsuz bir döngü yürütür. Hata ayıklayıcı etkin değilse debug, bir döngü yok işlemdir. "Chronon" okunduğunda artık 0, "ifg" dalı alınmıyor ve yürütme bir hata koşulu olan kodun sonuna ulaşıyor.


2

MATLAB, 6 bayt

dbquit

Hata ayıklayıcıda durdurulduğunda, bu hata ayıklama modundan çıkacaktır.

Hata ayıklama altında olmadığında, hata ayıklayıcıda durdurulmadığında kullanılamayacağına dair bir hata mesajı yazdırır.

Bunun yalnızca komut penceresinde (MATLAB kodunu çalıştırmanın üç yolundan biri) değerlendirme için işe yaradığına dikkat edilmelidir. Komut dosyasını veya işlevi çalıştırmayı denediğinizde, bir işlev veya komut dosyasında çalışmaz, yürütme sırasında hata ayıklama modunda kalmayı bırakırsınız.

Bir işlev / komut dosyasında da çalışacak bir şeye en yakın olan şey:

MATLAB, 22 bayt

feature('IsDebugMode')

Bu MATLAB'da belgelenmemiş bir komuttur. Bir komut dosyasında veya işlevde hata ayıklayıcıda durdurulur ve yukarıdaki satırı içeren başka bir işlevi (veya komut değerlendirmesini) çağırırsanız, true değerini döndürür.

Hata ayıklayıcının dışında yanlış döndürür.

Bununla birlikte, yukarıdakileri içeren bir komut dosyası / işlev çalıştırırsanız, komut dosyasının / işlevin başlangıcına bir kesme noktası ekleyip adım atsanız bile, yanlış döner, çünkü tekrar çalıştırmaya başladığınızda, geçici olarak hata ayıklayıcı.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.