デバッガの内外で異なる動作をするプログラム[終了]


18

課題は、引数やその他の入力を受け取らず、デバッグされていないときの動作とはデバッガーで異なる動作をする決定性プログラム(任意の言語/ OS)を記述することです。

たとえば、プログラムはデバッグ中は何かを出力しますが、デバッグされていない場合は何も出力しません。または、それぞれの場合に異なるものを出力します。または、デバッグ中はクラッシュしますが、デバッグされていない場合はクラッシュしません。またはその逆。

警告と説明:

  • タイミングの違いは考慮されません。
  • 通訳言語が許可されています。
  • 決定性を強調するために、動作はデバッグコンテキスト内外で正確に再現可能でなければなりません。
  • デバッガー自体の存在は、2つのケースの唯一の違いです。
    • 入力(stdinまたはargv ENVなど)を追加するようデバッガーに指示することは不正です。デバッガーはプログラムを「そのまま」実行する必要があります。
    • デバッグ実行と非デバッグ実行の間で環境を変更する(仮想マシンまたは異なるOSで実行する、メモリ制限などのOS設定を変更する)ことは許可されていません。

最短のコードが優先されます。デバッガがどのように動作するかについて興味深いことを明らかにする賞金を授与することができます。


4
一部のデバッガは、起動時に通常のコンパイラに異なるテキストを出力するため、どのプログラムもこれらの条件を満たすようです。それはカウントされますか?
ウィートウィザード

1
すべての出力はデバッガーからではありませんか?区別する場合、デバッガ出力とプログラム出力の違いはわかりません。
ウィートウィザード

5
デバッガーを定義しますか?
アルテミスは

3
デバッガとはどういう意味ですか?どれ?
MilkyWay90

6
デバッガをどのように定義しますか?言語インタープリターが「デバッグ」モード(非標準コマンドを導入するなど)をサポートしている場合、それは考慮されますか?
エソランジングフルーツ

回答:


31

LinuxおよびOSX上のx86およびx64_64マシン言語、1バイト

0x0:  CC    int3 

オンラインでお試しください!

int 3SIGTRAPブレークポイントに遭遇したかのようにデバッガを停止させるa をスローします。デバッガーの外部で、カーネルはプロセスを終了します(修正してくれた@Ruslanに感謝します)。

C(gcc)(x86 LinuxおよびOSX)、14 11 9バイト

main=204;

オンラインでお試しください!

整数204int 3命令に対応します。TIOリンクは上記と同じです。


1
Cコードの割り当てを明確にします。以前は見たことがないです。
トム

4
実際にSIGTRAPはにはなりませんSIGABRTので、呼び出しに関する部分abort()は間違っています。にはデフォルトのシグナルハンドラがないSIGTRAPので、カーネルはプロセスを終了します(親はWIFSIGNALEDこれを検出し、WTERMSIG発生したシグナルを判断するために使用できます)。
ルスラン

9

APL(Dyalog Unicode)、0バイト

Dyalog APLでは、IDEインタープリターまたはランタイムインタープリターのいずれかでワークスペースを実行することにより、デバッガーvsデバッガーが選択されません。

完全に空のデフォルト設定ワークスペースをIDEインタープリターにロードすると、アプリケーションを終了するにはインタープリターをアクティブにシャットダウンする必要があるため、ユーザーはすぐにREPLモードになります。

IDE REPL

ただし、ランタイムインタープリターにはREPLモードがないため、アプリケーションが終了した場合(完全に空など)、インタープリターを明示的にシャットダウンしなかった場合、暗黙的にREPLモードに到達しようとしました(「 APLセッション」)、および不満:

ランタイムダイアログ


9

FirefoxのJavaScript、69バイト

警告:このスクリプトはブラウザをハングさせる可能性があります!他のブラウザ(Chromeなど)でテストしないでください。タブ/ブラウザがクラッシュする可能性があります。

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

方法:consoleタブをアクティブにしてデバッガーを有効にした場合。console.logメモリリークを可能にし、プログラムはすぐにメモリを使い果たします。デバッガが無効になっている場合、GCは割り当てられたメモリをクリアし、1最終的にテキストを含むアラートが表示されます。


8

MSVC(64ビット)、50 35バイト

main(){return IsDebuggerPresent();}

通常はコード0で終了しますが、デバッガーでは1になります(WinDbgは終了コードを自動的に表示しませんが、スタックを調べることで偽造できることに注意してください)。編集:@Ruslanのおかげで15バイト保存されました。


1
MSVCにはプロトタイプが必要ですか?その後、C89モードでMinGWを試して、いくつかのバイトを節約することができます。
ルスラン

@Ruslanフン、私はCを使用しましたので、それがされていますどのくらいのショー...
ニール

7

T-SQL、6バイト

sp_who

デバッガーがアクティブな場合、常に実行中のユーザーの名前の下に追加の行を返します。


5

Python、29バイト

import sys
sys.modules['pdb']

デバッガーなし(python3 /tmp/foo.py):

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

デバッガー(python3 -m pdb /tmp/foo.py)の場合:

(empty output)

なぜならpdb後者の場合にアプリ可視モジュールにロードされます。



4

Java、131 102100バイト

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

デバッガなしで実行すると、この関数は長さ1の配列を返します。デバッガで実行すると、長さ2(1より大きい)の配列を返します。

オンラインでお試しください!

これは、デバッガーをアタッチできるかどうかを技術的に検出します。現在接続されている場合ではありません...それが有効かどうかわからない

-23は、おかげバイトオリヴィエ・グレゴワール私は実行時パラメータにとラムダizing私の答えのための検索何を削減できることを言及するために

-5バイトは、Javaを暗黙的に変換できるときに呼び出しが愚かであることに注意してくれたBenjamin Urquhartに感謝します。toString

- 戻り値の型を変更したBenjamin Urquhartに感謝


3
ラムダを使用して短縮できます。また、:jdwpではなくでのみテストできる可能性が非常に高くなります-agentlib:jdwp:区別することですrunjdwpから-agentlib:jdwp108バイト
オリビエグレゴワール


2
@BenjaminUrquhart私はtoStringここで機能強化を逃したことについて愚かだと感じています。良いキャッチ!
ポケ

100バイト -デバッガーがアクティブになっていない場合は長さ1の配列を返し、存在する場合は少なくとも2の長さの配列を返します。
ベンジャミンアーカート

3

Robotalk、22バイト

debug l: chronon l ifg

デバッガーがアクティブな場合、debug命令は現在のゲームティックの終わりまで実行を一時停止します。この場合、変数「chronon」は読み取り時に常に1以上であり、プログラムは無限ループを実行します。デバッガーがアクティブでない場合debugは、1サイクルのノーオペレーションです。「Chronon」は読み取られると0になり、「ifg」ブランチは使用されず、実行はコードの最後に到達します。これはエラー状態です。


2

MATLAB、6バイト

dbquit

デバッガーで停止すると、デバッグモードが終了します。

デバッグ中でないときは、デバッガーで停止しないと使用できないというエラーメッセージを出力します。

これは、コマンドウィンドウ(MATLABコードを実行する3つの方法の1つ)での評価に対してのみ機能することに注意してください。スクリプトまたは関数を実行しようとすると、実行中にデバッグモードになるのをやめるため、関数またはスクリプトでは機能しません。

関数/スクリプトで実行されるものに最も近いものは次のとおりです。

MATLAB、22バイト

feature('IsDebugMode')

これは、MATLABで文書化されていないコマンドです。スクリプトまたは関数でデバッガーで停止してから、上記の行を含む別の関数(またはコマンド評価)を呼び出すと、trueが返されます。

デバッガーの外部ではfalseを返します。

ただし、上記を含むスクリプト/関数を実行するだけであれば、スクリプト/関数の最初にブレークポイントを追加してステップスルーしても、falseが返されます。実行を開始すると、一時的にデバッガ。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.