โปรแกรมที่ทำงานแตกต่างกันใน / ออกจากโปรแกรมดีบั๊ก [ปิด]


18

ความท้าทายคือการเขียนโปรแกรมที่กำหนด (ภาษาใด ๆ / OS) ซึ่งจะมีข้อโต้แย้งหรือป้อนข้อมูลอื่น ๆ และการทำงานแตกต่างกันในการดีบักจากวิธีการที่จะทำงานเมื่อไม่ได้กำลังดีบั๊ก

ตัวอย่างเช่นโปรแกรมอาจแสดงผลบางอย่างเมื่อถูกดีบั๊ก แต่จะไม่แสดงผลอะไรเมื่อไม่ได้ดีบั๊ก หรือเอาท์พุทที่แตกต่างกันในแต่ละกรณี หรืออาจมีปัญหาเมื่อถูกดีบั๊ก แต่ไม่ผิดพลาดเมื่อไม่ดีบั๊ก หรือในทางกลับกัน

คำเตือนและการชี้แจง:

  • ความแตกต่างของเวลาไม่นับ
  • อนุญาตให้ใช้ล่ามภาษา
  • เพื่อเน้นระดับ: พฤติกรรมจะต้องทำซ้ำได้อย่างแน่นอนทั้งในและนอกบริบทการแก้ไขจุดบกพร่อง
  • การมีอยู่ของตัวดีบักควรแตกต่างระหว่างสองกรณีเท่านั้น
    • การบอกดีบักเกอร์เพื่อเพิ่มอินพุต (stdin หรือ argv ENV หรืออะไรก็ตาม) คือการโกงดีบักเกอร์ควรเรียกใช้โปรแกรม "ตามที่เป็น"
    • การเปลี่ยนสภาพแวดล้อม (เช่นการทำงานในเครื่องเสมือนหรือระบบปฏิบัติการที่แตกต่างกันหรือเปลี่ยนการตั้งค่าระบบปฏิบัติการเช่นขีด จำกัด หน่วยความจำ) ระหว่างการดีบักและการทำงานที่ไม่ใช่การดีบักไม่ได้รับอนุญาต

รหัสที่สั้นที่สุดชนะ ฉันอาจมอบรางวัลซึ่งแสดงให้เห็นสิ่งที่น่าสนใจเกี่ยวกับวิธีการทำงานของผู้ debuggers


4
ผู้ debuggers บางคนส่งข้อความที่แตกต่างกันเมื่อเริ่มต้นไปที่คอมไพเลอร์ปกติดังนั้นโปรแกรมใด ๆ ที่ดูเหมือนจะตรงตามเงื่อนไขเหล่านี้ นั่นนับหรือไม่
ข้าวสาลี Wizard

1
เอาท์พุททั้งหมดมาจากตัวดีบั๊กหรือไม่ มันไม่ชัดเจนสำหรับฉันว่าเอาต์พุตของดีบักเกอร์เทียบกับเอาต์พุตของโปรแกรมคืออะไรถ้าเราสร้างความแตกต่าง
ข้าวสาลี Wizard

5
กำหนดดีบักเกอร์?
อาร์ทิมิสสนับสนุนโมนิก้า

3
คุณหมายถึงอะไรโดยดีบักเกอร์ อันไหน?
MilkyWay90

6
คุณกำหนดดีบักเกอร์อย่างไร หากล่ามภาษารองรับโหมด "ดีบัก" (ซึ่งพูดแนะนำคำสั่งที่ไม่เป็นมาตรฐาน) จะนับรวมไหม
ผลไม้แยกแยะ

คำตอบ:


31

ภาษาเครื่อง x86 และ x64_64 บน Linux และ OSX, 1 ไบต์

0x0:  CC    int3 

ลองออนไลน์!

int 3 พ่น SIGTRAPซึ่งจะทำให้ดีบักเกอร์หยุดราวกับว่ามันพบกับเบรกพอยต์ นอกตัวดีบักเคอร์เนลจะยุติกระบวนการ (ขอบคุณ @Ruslan สำหรับการแก้ไข)

C (gcc) (x86 Linux และ OSX), 14 11 9 ไบต์

main=204;

ลองออนไลน์!

จำนวนเต็ม204สอดคล้องกับint 3คำสั่ง; ลิงก์ TIO เหมือนด้านบน


1
ชัดเจนการมอบหมายในรหัส C ไม่เคยเห็นมาก่อน
ทอม

4
ที่จริงแล้วSIGTRAPไม่ได้ผลSIGABRTดังนั้นส่วนที่เกี่ยวกับการโทรabort()นั้นผิด ไม่มีตัวจัดการสัญญาณเริ่มต้นเพียงอย่างSIGTRAPเดียวดังนั้นเคอร์เนลจึงยุติกระบวนการ (และผู้ปกครองสามารถใช้WIFSIGNALEDเพื่อตรวจจับสิ่งนี้และWTERMSIGเพื่อพิจารณาว่าเกิดสัญญาณใด)
Ruslan

9

APL (Dyalog Unicode) , 0 ไบต์

ใน Dyalog APL ตัวเลือกการดีบักกับตัวดีบั๊กไม่ทำงานโดยการเรียกใช้เวิร์กสเปซในล่าม IDE หรือล่ามแบบรันไทม์

การโหลดเวิร์กสเปซการตั้งค่าเริ่มต้นที่ว่างเปล่าอย่างสมบูรณ์ในล่าม IDE จะปล่อยผู้ใช้เข้าสู่โหมด REPL ทันทีเนื่องจากแอปพลิเคชันต้องปิดล่ามเพื่อที่จะออก

IDE REPL

อย่างไรก็ตามล่ามรันไทม์ไม่มีโหมด REPL และดังนั้นหากแอปพลิเคชันมาถึงจุดสิ้นสุด (เช่นเนื่องจากว่างเปล่าทั้งหมด) และไม่ได้ปิดล่ามอย่างชัดเจนโดยปริยายมันได้พยายามเข้าถึงโหมด REPL (" เซสชัน APL ") และบ่น:

ไดอะล็อกรันไทม์


9

JavaScript บน Firefox ขนาด 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 ไม่แสดงรหัสออกโดยอัตโนมัติ แต่คุณสามารถปลอมได้โดยตรวจสอบสแต็ก) แก้ไข: บันทึก 15 ไบต์ขอบคุณ @Ruslan


1
MSVC ต้องการต้นแบบหรือไม่ จากนั้นคุณอาจต้องการลองใช้ MinGW ในโหมด C89 เพื่อบันทึกบางไบต์
Ruslan

@Ruslan Bah แสดงให้เห็นว่ามันนานแค่ไหนแล้วที่ข้าได้ใช้ C ...
Neil

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 102 100 ไบต์

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

เมื่อรันโดยไม่มีดีบักเกอร์ฟังก์ชันนี้จะส่งกลับอาร์เรย์ที่มีความยาว 1 เมื่อรันด้วยดีบักเกอร์จะส่งคืนอาร์เรย์ที่มีความยาว 2 (มากกว่า 1)

ลองออนไลน์!

เทคนิคนี้ตรวจพบว่าคุณสามารถแนบดีบักเกอร์ได้หรือไม่ ไม่ใช่ถ้ามีการเชื่อมต่ออยู่ ... ไม่แน่ใจว่าถูกต้อง

-23 bytes ขอบคุณOlivier Grégoireที่กล่าวถึงว่าฉันสามารถลดสิ่งที่ฉันค้นหาในพารามิเตอร์ runtime และสำหรับ lambda-izing คำตอบของฉัน

-5 ไบต์ขอบคุณBenjamin Urquhart ที่สังเกตว่าการโทรtoStringนั้นเป็นใบ้เมื่อฉันสามารถให้ Java แปลงโดยปริยาย

-2 ไบต์ขอบคุณBenjamin Urquhartสำหรับการเปลี่ยนประเภทผลตอบแทน


3
คุณสามารถย่อให้สั้นลงโดยใช้แลมบ์ดา นอกจากนี้ก็มีโอกาสมากที่คุณสามารถทดสอบได้เฉพาะบนแทน:jdwp คือการแยกแยะความแตกต่างจาก 108 ไบต์-agentlib:jdwp:runjdwp-agentlib:jdwp
Olivier Grégoire


2
@BenjaminUrquhart ฉันรู้สึกโง่ที่ขาดการtoStringปรับปรุงที่นี่ จับดี!
Poke

100 ไบต์ - ส่งกลับอาร์เรย์ของความยาว 1 เมื่อไม่มีดีบักเกอร์ทำงานอยู่อาร์เรย์ที่มีความยาวอย่างน้อย 2 ถ้าสามารถมีได้
Benjamin Urquhart

3

Robotalk , 22 ไบต์

debug l: chronon l ifg

หากดีบักเกอร์ทำงานอยู่debugคำสั่งจะหยุดการทำงานจนกว่าจะจบเกมที่มีขีด ในกรณีนี้ตัวแปร "chronon" จะเป็น 1 หรือมากกว่าเสมอเมื่ออ่านและโปรแกรมจะดำเนินการวนรอบไม่สิ้นสุด หากโปรแกรมดีบั๊กไม่ทำงานdebugจะเป็นหนึ่งรอบไม่มี "Chronon" ตอนนี้เป็น 0 เมื่ออ่านแล้วจะไม่มีการใช้สาขา "ifg" และการดำเนินการจะสิ้นสุดของรหัสซึ่งเป็นเงื่อนไขข้อผิดพลาด


2

MATLAB, 6 ไบต์

dbquit

เมื่อหยุดในดีบักเกอร์สิ่งนี้จะออกจากโหมดการดีบัก

เมื่อไม่ได้อยู่ภายใต้การแก้ปัญหามันจะพิมพ์ข้อความแสดงข้อผิดพลาดที่ไม่สามารถใช้งานได้เมื่อไม่หยุดในตัวดีบัก

ควรสังเกตว่าสิ่งนี้ใช้ได้สำหรับการประเมินในหน้าต่างคำสั่งเท่านั้น (หนึ่งในสามวิธีในการใช้งานรหัส MATLAB) มันจะไม่ทำงานในฟังก์ชั่นหรือสคริปต์เมื่อคุณพยายามเรียกใช้สคริปต์หรือฟังก์ชั่นคุณหยุดอยู่ในโหมดการแก้ปัญหาในระหว่างการดำเนินการ

สิ่งที่ใกล้เคียงที่สุดที่คุณสามารถเข้าถึงสิ่งที่จะทำงานในฟังก์ชั่น / สคริปต์ก็จะเป็น

MATLAB, 22 ไบต์

feature('IsDebugMode')

นี่คือคำสั่งที่ไม่มีเอกสารใน MATLAB หากคุณหยุดทำงานในโปรแกรมดีบั๊กในสคริปต์หรือฟังก์ชั่นแล้วเรียกใช้ฟังก์ชันอื่น (หรือการประเมินคำสั่ง) ที่มีบรรทัดด้านบนมันจะกลับมาจริง

นอกดีบักมันจะกลับเท็จ

หากคุณเพียงแค่เรียกใช้สคริปต์ / ฟังก์ชั่นที่มีข้างต้นแม้ว่าคุณจะเพิ่มเบรกพอยต์ที่จุดเริ่มต้นของสคริปต์ / ฟังก์ชั่นและขั้นตอนที่ผ่านมันจะกลับเท็จเพราะอีกครั้งเมื่อคุณเริ่มดำเนินการคุณหยุดอยู่ใน ดีบักเกอร์ชั่วคราว

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.