Chương trình hoạt động khác nhau trong / ngoài trình gỡ lỗi [đã đóng]


18

Thách thức là viết một chương trình xác định (bất kỳ ngôn ngữ / HĐH nào) không có đối số hoặc đầu vào khác và hành xử khác nhau trong trình gỡ lỗi từ cách nó hoạt động khi không được gỡ lỗi .

Ví dụ, chương trình có thể xuất ra một cái gì đó khi được gỡ lỗi nhưng không xuất ra bất cứ thứ gì khi không được gỡ lỗi. Hoặc đầu ra một cái gì đó khác nhau trong từng trường hợp. Hoặc nó có thể bị sập khi được gỡ lỗi nhưng không bị sập khi không được sửa lỗi. Hoặc ngược lại.

Hãy cẩn thận và làm rõ:

  • Sự khác biệt về thời gian không được tính.
  • Ngôn ngữ được giải thích được cho phép.
  • Để nhấn mạnh tính xác định: hành vi phải được tái tạo chính xác cả trong và ngoài bối cảnh gỡ lỗi.
  • Sự hiện diện của trình gỡ lỗi chính nó nên sự khác biệt duy nhất giữa hai trường hợp.
    • Nói rằng trình gỡ lỗi để thêm đầu vào (stdin hoặc argv ENV hoặc bất cứ điều gì) là gian lận, trình gỡ lỗi nên chạy chương trình "nguyên trạng".
    • Thay đổi môi trường (ví dụ: chạy trong máy ảo hoặc HĐH khác hoặc thay đổi cài đặt HĐH như giới hạn bộ nhớ) giữa các lần chạy gỡ lỗi và không gỡ lỗi là không được phép.

Mã ngắn nhất sẽ thắng. Tôi có thể thưởng một tiền thưởng tiết lộ điều thú vị về cách các trình gỡ lỗi hoạt động.


4
Một số trình gỡ lỗi xuất văn bản khác nhau khi khởi động vào trình biên dịch bình thường, do đó, bất kỳ chương trình nào dường như đáp ứng các điều kiện này. Có tính không?
Phù thủy lúa mì

1
Không phải tất cả đầu ra đến từ trình gỡ lỗi? Tôi không rõ đầu ra của trình gỡ lỗi là gì so với đầu ra của chương trình nếu chúng ta tạo ra sự khác biệt.
Phù thủy lúa mì

5
Xác định trình sửa lỗi?
Artemis hỗ trợ Monica

3
Bạn có ý nghĩa gì bởi trình gỡ lỗi? Cái nào?
MilkyWay90

6
Làm thế nào để bạn xác định một trình sửa lỗi? Nếu một trình thông dịch ngôn ngữ hỗ trợ chế độ "gỡ lỗi" (giả sử, giới thiệu các lệnh không chuẩn), điều đó có được tính không?
Esolanging Fruit

Câu trả lời:


31

ngôn ngữ máy x86 và x64_64 trên Linux và OSX, 1 byte

0x0:  CC    int3 

Hãy thử trực tuyến!

int 3ném một SIGTRAPcái sẽ khiến trình gỡ lỗi dừng lại như thể nó gặp phải một điểm dừng. Bên ngoài trình gỡ lỗi, kernel chấm dứt quá trình (nhờ @Ruslan để sửa lỗi).

C (gcc) (x86 Linux và OSX), 14 11 9 byte

main=204;

Hãy thử trực tuyến!

Số nguyên 204tương ứng với int 3hướng dẫn; liên kết TIO giống như trên.


1
phân công rõ ràng trong mã C, chưa từng thấy điều đó trước đây.
Tom

4
Trên thực tế SIGTRAPkhông có kết quả SIGABRT, vì vậy phần về cách gọi abort()là sai. Đơn giản là không có trình xử lý tín hiệu mặc định nào SIGTRAP, vì vậy kernel kết thúc quá trình (và cha mẹ có thể sử dụng WIFSIGNALEDđể phát hiện điều này và WTERMSIGđể xác định tín hiệu nào đã xảy ra).
Ruslan

9

APL (Dyalog Unicode) , 0 byte

Trong Dyalog APL, trình gỡ lỗi và không có trình gỡ lỗi nào được chọn bằng cách chạy không gian làm việc của một người trong trình thông dịch IDE hoặc trình thông dịch thời gian chạy.

Đang tải một không gian làm việc mặc định hoàn toàn trống vào trình thông dịch IDE, ngay lập tức thả người dùng vào chế độ REPL vì các ứng dụng phải chủ động tắt trình thông dịch để nó thoát ra:

IDE REPL

Tuy nhiên, trình thông dịch thời gian chạy không có chế độ REPL và vì vậy nếu một ứng dụng kết thúc (ví dụ vì nó hoàn toàn trống rỗng) và không tắt trình thông dịch một cách rõ ràng, nó đã cố gắng đạt đến chế độ REPL (" Phiên APL ") và phàn nàn:

Hộp thoại thời gian chạy


9

JavaScript trên Firefox, 69 byte

CẢNH BÁO : Tập lệnh này có thể treo trình duyệt của bạn! KHÔNG kiểm tra nó với các trình duyệt khác (ví dụ Chrome) vì nó có thể làm sập tab / trình duyệt của bạn.

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

Cách thực hiện: Khi trình gỡ lỗi được kích hoạt với consoletab được kích hoạt. console.loglàm cho bộ nhớ bị rò rỉ và chương trình sẽ hết bộ nhớ sớm. Khi trình gỡ lỗi bị vô hiệu hóa, GC sẽ xóa bộ nhớ được phân bổ và 1cuối cùng bạn sẽ thấy một cảnh báo với văn bản .


8

MSVC (64 bit), 50 35 byte

main(){return IsDebuggerPresent();}

Thoát với mã 0 bình thường nhưng 1 trong trình gỡ lỗi (lưu ý rằng WinDbg không tự động hiển thị mã thoát nhưng bạn có thể giả mạo nó bằng cách kiểm tra ngăn xếp). Chỉnh sửa: Đã lưu 15 byte nhờ @Ruslan.


1
MSVC có yêu cầu nguyên mẫu không? Sau đó, bạn có thể muốn thử với MinGW ở chế độ C89, để lưu một số byte.
Ruslan

@Ruslan Bah, cho thấy đã bao lâu kể từ khi tôi sử dụng C ...
Neil

7

T-SQL, 6 byte

sp_who

Luôn trả về một hàng thừa dưới tên người dùng đang thực thi khi trình gỡ lỗi hoạt động.


5

Python, 29 byte

import sys
sys.modules['pdb']

Không có trình gỡ lỗi ( python3 /tmp/foo.py):

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

Với trình gỡ lỗi ( python3 -m pdb /tmp/foo.py):

(empty output)

bởi vì pdbđược tải vào một mô-đun hiển thị ứng dụng trong trường hợp thứ hai.



4

Java, 131 102 100 byte

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

Khi chạy mà không có trình gỡ lỗi, hàm này trả về một mảng có độ dài 1. Khi chạy với trình gỡ lỗi, hàm này trả về một mảng có độ dài 2 (lớn hơn 1).

Hãy thử trực tuyến!

Điều này về mặt kỹ thuật phát hiện nếu bạn có thể đính kèm trình gỡ lỗi; không nếu một cái hiện đang được kết nối ... Không chắc chắn nếu điều đó hợp lệ

-23 byte nhờ Olivier Grégoire đã đề cập rằng tôi có thể cắt giảm những gì tôi tìm kiếm trong các tham số thời gian chạy và cho lambda-izing câu trả lời của tôi

-5 byte nhờ có Benjamin Urquhart vì đã lưu ý rằng việc gọi toStringbị câm khi tôi có thể để Java chuyển đổi hoàn toàn

-2 byte nhờ vào Benjamin Urquhart vì đã thay đổi kiểu trả về


3
Bạn có thể rút ngắn nó bằng lambda. Ngoài ra, rất có khả năng bạn chỉ có thể kiểm tra trên :jdwp, thay vì -agentlib:jdwp. Các :là để phân biệt runjdwptừ -agentlib:jdwp. 108 byte
Olivier Grégoire


2
@BenjaminUrquhart Tôi cảm thấy ngớ ngẩn vì đã bỏ lỡ sự toStringtăng cường ở đây. Nắm bắt tốt!
Chọc

100 byte - trả về mảng có độ dài 1 khi không có trình gỡ lỗi nào hoạt động, mảng có độ dài ít nhất là 2 nếu có thể có một.
Benjamin Urquhart

3

Robotalk , 22 byte

debug l: chronon l ifg

Nếu trình gỡ lỗi đang hoạt động, debughướng dẫn tạm dừng thực thi cho đến khi kết thúc đánh dấu trò chơi hiện tại. Trong trường hợp này, biến "chronon" luôn luôn là 1 hoặc lớn hơn khi đọc và chương trình thực hiện một vòng lặp vô hạn. Nếu trình gỡ lỗi không hoạt động, debuglà một no-op một chu kỳ. "Chronon" bây giờ là 0 khi đọc, nhánh "ifg" không được thực hiện và thực thi đến cuối mã, đây là một điều kiện lỗi.


2

MATLAB, 6 byte

dbquit

Khi dừng trong trình gỡ lỗi, điều này sẽ thoát khỏi chế độ gỡ lỗi.

Khi không được gỡ lỗi, nó sẽ in một thông báo lỗi rằng nó không thể được sử dụng khi không dừng trong trình gỡ lỗi.

Cần lưu ý rằng điều này chỉ hoạt động để đánh giá trong cửa sổ lệnh (một trong ba cách chạy mã MATLAB). Nó sẽ không hoạt động trong một chức năng hoặc tập lệnh vì một khi bạn cố chạy tập lệnh hoặc chức năng, bạn sẽ dừng ở chế độ gỡ lỗi trong khi thực thi.

Gần nhất bạn có thể nhận được một cái gì đó sẽ chạy trong một chức năng / tập lệnh cũng sẽ là:

MATLAB, 22 byte

feature('IsDebugMode')

Đây là một lệnh không có giấy tờ trong MATLAB. Nếu bạn bị dừng trong trình gỡ lỗi trong một tập lệnh hoặc hàm, sau đó gọi một hàm khác (hoặc đánh giá lệnh) có chứa dòng trên, nó sẽ trả về đúng.

Bên ngoài trình gỡ lỗi nó sẽ trả về false.

Tuy nhiên, nếu bạn chỉ chạy một tập lệnh / hàm chứa ở trên, ngay cả khi bạn thêm một điểm dừng khi bắt đầu tập lệnh / hàm và bước qua, nó sẽ trả về false, vì một lần nữa, khi bạn bắt đầu thực thi, bạn sẽ dừng lại ở gỡ lỗi tạm thời.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.