วิธีตรวจหน่วยความจำเกินสำหรับโค้ดโปรแกรม

ตอนทำเกรดเดอร์ของ 111 (1DG) ได้รับคำแนะนำจากอาจารย์มะนาวว่าให้ใช้ sandbox กันหน่วยความจำเกินของ Mares สำหรับผู้เรียนที่เป็นคนตรวจสอบการเขียนโค้ดเอง ถ้าสามารถรันคำสั่งในลักษณะเดียวกันได้ก็จะสามารถเช็คหน่วยความจำเกินได้ไม่ยาก และมีประโยชน์กว่า X หรือ T โดดๆ จากเกรดเดอร์

ขั้นแรก โหลดไฟล์ Sandbox มาจาก https://github.com/cafe-grader-team/cafe-grader-judge-scripts/blob/master/std-script/box64-new.c (กด Raw แล้ว Ctrl+S เซฟไว้สักที่) เสร็จแล้วคอมไพล์ด้วย GCC (ทั้งนี้สำหรับนิสิต 111 หมู่ 1 ในเซิร์ฟเวอร์กลางมีคำสั่งนี้ให้ใช้ได้ทันที ข้ามขั้นตอนนี้ไปได้เลย)

gcc box64-new.c -o box

หลังจากนั้นจะได้ไฟล์ชื่อ box แนะนำให้ย้ายไปไว้ใน $PATH สักโฟลเดอร์ (ท่าที่ง่ายที่สุดคือย้ายเข้าไปใน /bin)

sudo mv box /bin

รันคำสั่งbox หนึ่งที ควรจะได้ output ออกมาประมาณนี้

ถ้าได้แล้วแปลว่าทุกอย่างโอเค ให้เขียน input ที่ต้องการใส่ไว้เป็นไฟล์ไฟล์หนึ่ง แล้วรันคำสั่ง

box -a 2 -f -T -t [เวลาที่จะจำกัด] -m [เมมที่จะจำกัด (kB)] -i [ไฟล์ input] [ไฟล์โปรแกรมที่คอมไพล์แล้ว]

เช่น ถ้าจะรันให้ทัน 2 วินาที ในเมม 32MB (32768KB) โดยรับข้อมูลเข้าจากไฟล์ input-4.txt และโปรแกรมชื่อ a.out ให้รัน

box -a 2 -f -T -t 2 -m 32768 -i input-4.txt a.out

คำเตือนคือตรงชื่อไฟล์ที่จะรันต้องเป็นพาธที่ถูกต้อง สำหรับนิสิต 111 หมู่ 1 ถ้าจะรันไพธอนให้รันด้วย

box -a 2 -f -T -t 2 -m 32768 -i input-4.txt $(which python) program.py

ท่อน $(which python) จะทำการยัด full path ของ Python ในเครื่องมาให้

ถ้ารันผ่านควรจะมี output ออกมายาวๆ ว่าโอเค แต่ถ้ารันไม่ทันควรจะขึ้นว่า signal 6 หรือ signal 11 อันใดอันหนึ่ง ส่วนถ้าเวลาเกินก็ขึ้นชัดเจนว่า Time limit exceeded

Comments

Leave a Reply

Your email address will not be published. Required fields are marked *