ฉันจะดักโปรแกรมที่คืนค่า 139 (การแบ่งเซกเมนต์ผิดพลาด) ใน bash ได้อย่างไร?


10

ฉันมีสคริปต์ทุบตีที่ทดสอบโปรแกรมบางโปรแกรมและหนึ่งในโปรแกรมส่งคืนSegmentation faultดังนั้นฉันจึงพยายามเพิ่มกับดักไว้ในหัวสคริปต์ของฉัน:

trap "echo 'segfault occured!'" SIGSEGV

อย่างไรก็ตามไม่ได้ทำอะไรเลย ฉันใช้

echo $?

หลังจากโปรแกรมที่สร้าง segfault และฉันได้รับ139เป็นผลลัพธ์ ฉันจะเพิ่มกับดักสำหรับรหัสข้อผิดพลาดเฉพาะนั้นได้อย่างไร

คำตอบ:


7

trap "$instructions" SIGSEGV ข้อผิดพลาดการแบ่งส่วนกับดักในเปลือกตัวเอง

หากคุณเรียกใช้สคริปต์ภายใต้set -eคุณสามารถวางกับดักEXIT(หรือ0) มันจะถูกดำเนินการเมื่อสคริปต์ของคุณสิ้นสุดลง (ไม่ว่าจะเกิดจากคำสั่งที่ส่งคืนสถานะที่ไม่ใช่ศูนย์หรือโดยการโทรexitหรือโดยชัดแจ้งเมื่อสิ้นสุดสคริปต์) หากต้องการทดสอบข้อผิดพลาดในการแบ่งกลุ่มให้ตรวจสอบการ$?เข้าสู่กับดัก (โปรดทราบว่า$?อาจเป็น 139 เนื่องจากโปรแกรมส่งคืนตามปกติด้วยสถานะ 139 ซึ่งจะหลีกเลี่ยงได้หากคุณทำการประมวลผลในเชลล์)

set -e
trap 'case $? in
        139) echo "segfault occurred";;
      esac' EXIT

ใน bash หรือ ksh หรือ zsh คุณไม่จำเป็นต้องใช้set -eเพื่อดำเนินการกับดักหลังจากแต่ละคำสั่งที่ส่งกลับสถานะที่ไม่ใช่ศูนย์คุณสามารถวางกับดักERRแทน ก่อนหน้านี้คุณต้องตรวจสอบการ$?เข้าสู่กับดักและ 139 สามารถ (แต่ไม่ค่อยมี) หมายความว่าโปรแกรมส่งคืนสถานะนี้


6

จากman bash:

   trap [-lp] [[arg] sigspec ...]
          The command arg is to  be  read  and  executed  when  the  shell
          receives  signal(s)  sigspec.

เมื่อโปรแกรมของคุณเริ่มต้นการทุบตีของคุณจะเกิดขึ้นSIGCHLDเพราะเด็กบางคนออกจากงาน

อย่างไรก็ตามคุณสามารถใช้ exitcode ที่เก็บไว้ใน$?เงื่อนไขและกับดักSIGCHLD:

trap 'if [[ $? -eq 139 ]]; then echo "segfault !"; fi' CHLD

โปรดทราบว่าset -bmอาจจำเป็นหากมีการใช้สิ่งนี้ (สิ่งที่มันอาจเป็น) ใน bash แบบไม่โต้ตอบ (เช่นสคริปต์)

แก้ไข:ดูเพิ่มเติมนี้ (Gilles') คำตอบเกี่ยวกับปัญหาคล้ายกันโดยใช้และbashtrap


มีบางอย่างแปลก ๆ เกิดขึ้น ฉันใช้กับดักtrap "echo 'something happened!'" {1..64}และยังไม่ได้อะไรเลย ฉันยังลองกับset -bmและset -o monitorแต่ nada
Pithikos

คุณลองทำสิ่งนี้แบบโต้ตอบหรือไม่? trap "echo 'something happened'" {1..31}ใช้งานได้สำหรับฉัน (การละทิ้ง!และรายละเอียดสัญญาณเหล่านั้นที่นำไปสู่bash: trap: XX: invalid signal specification)
sr_
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.