วิธีการแก้ปัญหาสคริปต์ทุบตี?


31

มีวิธีการแก้จุดบกพร่องสคริปต์ทุบตีโดยไม่ต้องใช้ echo และเข้าสู่ระบบ?

ฉันกำลังพูดถึงการใช้เบรกพอยต์และสิ่งต่างๆเช่นนั้น

คำตอบ:



20

มีหลายวิธีเช่น:

  • รันสคริปต์ของคุณด้วยตัวเลือก -x

    bash -x yourscript.sh
  • เพิ่มset -xในบรรทัดใหม่ที่จุดเริ่มต้นของ scriptfile หลังจาก Shebang #!/bin/bashและก่อนที่จะเริ่มสคริปต์ของคุณset -vจะแสดงบรรทัดอินพุตเชลล์set -xแสดงคำสั่งและอาร์กิวเมนต์ที่ดำเนินการ

  • แทนที่ shebang ของไฟล์สคริปต์ของคุณด้วย #!/bin/bash -xv


10

ปัจจุบันมีเป็นของ Visual Studio นามสกุลรหัสทุบตีตรวจแก้จุดบกพร่อง มันมี 'ขั้นตอนใน / ออก / มากกว่า' และสามารถแสดงค่าของแต่ละตัวแปร

ภาพหน้าจอ VS Code Bash Debug



4

คุณสามารถใช้ฟังก์ชั่นขนาดเล็กนี้เพื่อวางลงใน "คอนโซล":

function debug
{
    echo "#############|  Entering DEBUG mode  |####################";
    cmd=""
    while [[ $cmd != "exit" ]]; do
        read -p "> " cmd
        case "$cmd" in
            vars ) ( set -o posix ; set );;
            exit ) ;;
            * ) eval "$cmd";;
        esac
    done
    echo "#############|  End of DEBUG mode |####################";
}

จากนั้นภายในสคริปต์ของคุณ (ตัวอย่าง):

for file in *; do
...
   if [[ $file == "strange_case.txt" ]]; then
       # break the code here to analyze:
       debug
   fi
...
done

มันจะยอมรับคำสั่งใด ๆ ทำให้ตัวแปรท้องถิ่นยังคงอยู่ หากต้องการออกจากโหมด "debug" ให้พิมพ์ "exit" (จะไม่ออกจากสคริปต์) และจะดำเนินการต่อด้วยรหัส หากคุณใช้ "debug" ภายในลูปมันจะหยุดทุกครั้ง คุณสามารถห่อไว้ใน "if" (ดังในตัวอย่างด้านบน) หรือสร้างฟังก์ชัน "watch":

function debug_watch
{
    if [[ $1 == $2 ]]; then
        debug
    fi
}

# And Use it:

debug_watch "$file" "strange_case.txt"

ฉันยังเพิ่มคำสั่ง "vars" ซึ่งจะถ่ายโอนตัวแปรและค่าที่มีอยู่ทั้งหมด คุณสามารถเพิ่มคำสั่งที่คุณกำหนดเองได้เช่นกัน

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


3
หลีกเลี่ยงการใช้ชื่อตัวแปรตัวพิมพ์ใหญ่ ความเสี่ยงของคุณเหนือกว่าตัวแปรเชลล์พิเศษและตัวแปรสภาพแวดล้อม นอกจากนี้ตรวจสอบให้แน่ใจว่าคุณอ้างการขยายพารามิเตอร์เมื่อใช้เป็นอาร์กิวเมนต์เพื่อหลีกเลี่ยงการแยกคำและการขยายชื่อพา ธ ที่เกิดขึ้นกับผลลัพธ์ เช่นและ* ) eval "$cmd" ;; debug_watch "$file" strange_case.txt
geirha

แก้ไขโค้ดตามที่ geirha แนะนำ
Lepe

2

เมื่อต้องการปรับแต่งสิ่งที่ NES กำลังพูดถึงมีการตั้งค่าสถานะเป็น bash เพื่ออนุญาตให้ทำการดีบัก

การset -xตั้งค่าสถานะอาจถูกตั้งค่าและยกเลิกการตั้งค่าจากเทอร์มินัลหรือจากภายในสคริปต์ของคุณ ใช้+หรือ-:

#!/bin/bash
#fileinfo
ls -l $1
set -x      # start debugging here
wc -l $1
set +x      # stop debugging here
file $1
set -v      # start verbose output
w | more    
echo ""
echo -n "Number of users: "
set +v      # end verbose output
who | wc -l

นี่คือสิ่งที่setคำสั่งทำ:

  • set -f ปิดใช้งานการสร้างชื่อไฟล์โดยใช้ตัวอักษร
  • set -v พิมพ์บรรทัดอินพุตเชลล์ (verbose) ขณะที่ถูกอ่าน
  • set -x พิมพ์ร่องรอยคำสั่งก่อนที่จะดำเนินการคำสั่ง

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

มีเครื่องมือบรรทัดคำสั่งมากมายที่สามารถช่วยให้คุณรับรายละเอียดเกี่ยวกับโปรแกรมของคุณเช่น:

  • stat แสดงไฟล์หรือสถานะระบบไฟล์
  • file กำหนดประเภทไฟล์
  • hexdump ตัวกรองที่แสดงไฟล์ที่ระบุในหลากหลายรูปแบบ
  • nohup เรียกใช้สคริปต์ที่จะไม่หยุด

    และอื่น ๆ มากมาย ฉันพยายามนึกถึงคำสั่งที่แสดงตัวละครที่ซ่อนอยู่ แต่ฉันไม่สามารถทำได้ตอนนี้ Hexdump จะทำ แต่มีดีกว่า

คำสั่งที่สำคัญctrl\จะทำให้โปรแกรมหรือสคริปต์ทำงานเพื่อถ่ายโอนข้อมูลหลัก จากนั้นคุณสามารถวิเคราะห์ coredump ฉันอาจจะใช้ gdb เพื่อวิเคราะห์ coredump แต่มีหลายโปรแกรมสำหรับสิ่งนั้น

เปลือก bash มีตัวเลือกที่ดีสำหรับการดีบักเช่นกัน ตัวเลือก--debugger, -vละเอียด, --dump-stringsและตัวเลือกที่ดีอื่น ๆ ที่จะช่วยให้คุณ ลองใช้man bashดู

trapคำสั่ง (เปลือกที่สร้างขึ้นใน) อาจจะเป็นประโยชน์มากสำหรับคุณ trap บอกว่าถ้าโปรแกรมของคุณออกโดยไม่คาดคิดให้รันบางสิ่ง คุณอ่านเกี่ยวกับดักและอื่น ๆ ที่มีประโยชน์ทุบตีเชลล์ builtins ที่นี่

โดยทั่วไปแล้วการดีบักเป็นหัวข้อใหญ่ในทุกภาษา หัวข้ออื่น ๆ ที่มีประโยชน์สำหรับการดีบักในภาษาการเขียนโปรแกรมใด ๆ ได้แก่ การเปลี่ยนเส้นทางเชลล์และการประมวลผลสัญญาณ

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


1

ตัวเลือก GUI สำหรับการดีบักสคริปต์ทุบตีคือ Eclipse IDE พร้อมกับ pluggins BashEclipse / Shelled

สิ่งนี้จะให้คุณสมบัติของคำถามของคุณ ( breakpoints and stuff) พร้อมกับโฮสต์ของคุณสมบัติอื่น ๆ สำหรับการดีบักสคริปต์ทุบตีที่ซับซ้อน

คุณลักษณะบางอย่างรวมถึง:
( https://unix.stackexchange.com/questions/155551/how-to-debug-a-bash-script )

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

มุมมองตัวแก้ไขสคริปต์: Eclipse Script IDE

มุมมองการดีบัก: มุมมองดีบักสคริปต์ Eclipse

ขั้นตอนสำหรับการใช้คือการเพิ่มShelledและBashEclipsepluggins เพื่อ eclipse จากนั้นรันโพรซีเดอร์ที่ระบุใน BashEclipse read me text file เพื่อเริ่มดีบักเกอร์

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