Làm thế nào để gỡ lỗi script bash?


31

Có cách nào để gỡ lỗi script bash mà không sử dụng echo và log không?

Tôi đang nói về việc sử dụng điểm dừng và những thứ như thế.

Câu trả lời:



20

Có nhiều cách khác nhau, nghĩa là:

  • Chạy tập lệnh của bạn với tùy chọn -x

    bash -x yourscript.sh
  • Thêm set -xvào một dòng mới ở đầu tập lệnh của bạn sau Shebang #!/bin/bashvà trước khi bắt đầu tập lệnh của bạn, set -vsẽ hiển thị các dòng đầu vào shell, set -xhiển thị các lệnh và đối số được thực thi

  • thay thế shebang của tập tin script của bạn bằng #!/bin/bash -xv




4

Bạn có thể sử dụng chức năng nhỏ này để thả vào "console":

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 |####################";
}

Sau đó, bên trong tập lệnh của bạn (VÍ DỤ):

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

Nó sẽ chấp nhận bất kỳ lệnh nào, giữ nguyên các biến cục bộ. Để thoát chế độ "gỡ lỗi", nhập "exit" (nó sẽ không thoát khỏi tập lệnh) và nó sẽ tiếp tục với mã. Nếu bạn sử dụng "gỡ lỗi" trong một vòng lặp, nó sẽ dừng mỗi lần. Bạn có thể bọc nó bên trong một chữ "nếu" (như trong ví dụ trên) hoặc tạo chức năng "xem":

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

# And Use it:

debug_watch "$file" "strange_case.txt"

Tôi cũng đã thêm lệnh "vars" sẽ kết xuất tất cả các biến có sẵn và giá trị của chúng. Bạn có thể thêm các lệnh tùy chỉnh của riêng bạn là tốt.

Tôi đã làm mã trong vài phút để sử dụng nó dưới rủi ro của riêng bạn. Xin lưu ý rằng trong chế độ gỡ lỗi, bất kỳ lệnh nào cũng có thể được thực thi, do đó, nó có thể gây rủi ro bảo mật nếu bạn để nó trong tập lệnh sản xuất.


3
Tránh sử dụng tên biến chữ hoa. Nguy cơ của bạn ghi đè các biến vỏ đặc biệt và biến môi trường. Ngoài ra, hãy đảm bảo bạn trích dẫn mở rộng tham số khi chúng được sử dụng làm đối số, để tránh việc chia tách từ và mở rộng tên đường dẫn xảy ra trên kết quả. ví dụ * ) eval "$cmd" ;;debug_watch "$file" strange_case.txt.
geirha

Mã chỉnh sửa theo đề xuất của geirha.
Lepe

2

Theo giai điệu của những gì NES đang nói, có các cờ được đặt trong bash để cho phép gỡ lỗi.

Các set -xlá cờ có thể được thiết lập và unset hoặc từ các thiết bị đầu cuối, hoặc từ bên trong kịch bản của bạn. Sử dụng +hoặc -:

#!/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

Đây là những gì các setlệnh làm:

  • set -f Vô hiệu hóa việc tạo tên tệp bằng siêu dữ liệu.
  • set -v In các dòng đầu vào shell (verbose) khi chúng được đọc.
  • set -x In dấu vết lệnh trước khi thực hiện lệnh.

setthực sự có nhiều tính năng, nhưng hy vọng không có trang man vì nó là một công cụ được tích hợp sẵn. Hướng dẫn cho tập hợp nằm trong tài liệu GNU Bash .

Có nhiều công cụ dòng lệnh có thể giúp bạn biết chi tiết về chương trình của mình như:

  • stat hiển thị tập tin hoặc trạng thái hệ thống tập tin
  • file xác định một loại tập tin.
  • hexdump bộ lọc hiển thị các tệp được chỉ định theo nhiều định dạng
  • nohup Chạy một kịch bản không bị treo

    và nhiều người khác. Tôi đã cố gắng nghĩ về lệnh hiển thị các ký tự ẩn, nhưng tôi không thể thực hiện nó ngay bây giờ. Hexdump sẽ làm điều đó nhưng có một cái tốt hơn.

Lệnh key ctrl\sẽ khiến chương trình hoặc tập lệnh đang chạy bị đổ lõi. Sau đó, bạn có thể phân tích coredump. Tôi có thể sẽ sử dụng gdb để phân tích một coredump, nhưng nhiều chương trình tồn tại cho điều đó.

Shell bash có một số tùy chọn tiện lợi để gỡ lỗi quá. tùy chọn --debugger, -vdài dòng --dump-stringsvà các tùy chọn tiện lợi khác để hỗ trợ bạn. Kiểm tra chúng bằng cách sử dụng man bash.

Các traplệnh (shell xây dựng trong) có thể sẽ rất hữu ích cho bạn. bẫy nói nếu chương trình của bạn thoát ra bất ngờ, hãy thực thi một cái gì đó. Bạn đọc về bẫy và các nội dung Bash Shell tiện dụng khác ở đây .

Nói chung vào lúc này, gỡ lỗi là một chủ đề lớn trong bất kỳ ngôn ngữ nào. Một số chủ đề khác có thể thuận tiện để gỡ lỗi trong bất kỳ ngôn ngữ lập trình nào, bao gồm chuyển hướng hệ vỏ và xử lý tín hiệu.

Cuối cùng, tôi nhận ra ví dụ tôi sử dụng là tầm thường, nhưng một số tập lệnh shell có thể là hàng trăm dòng. Trong những tình huống đó, tôi muốn chèn các thẻ nhận xét và chặn mã mà tôi nghi ngờ là bị lỗi, hoặc Cách khác, chèn lệnh thoát và cố gắng tách mã chức năng khỏi mã bị hỏng, sử dụng kỹ thuật phân chia và chinh phục.


1

Một tùy chọn GUI để gỡ lỗi một tập lệnh bash là IDE Eclipse với các pluggins BashEclipse / Shelled.

Điều này cung cấp các tính năng của câu hỏi của bạn ( breakpoints and stuff) cùng với một loạt các tính năng khác để gỡ lỗi các tập lệnh bash phức tạp.

Một số tính năng bao gồm:
( https://unix.stackexchange.com/questions/155551/how-to-debug-a-bash-script )

  • Chuyển đổi điểm
  • Hoạt động từng bước một
  • Các chức năng bước vào, bước ra, bước qua và các thói quen phụ
  • Kiểm tra các biến mã tại bất kỳ điểm nào trong khi tập lệnh đang chạy
  • Danh sách nhiệm vụ của TODO
  • Danh sách đánh dấu
  • Chỉnh sửa nhiều cửa sổ
  • Chia sẻ từ xa môi trường dự án

Phối cảnh Script Editor: IDE Script Eclipse

Phối cảnh gỡ lỗi: Phối cảnh gỡ lỗi tập lệnh Eclipse

Các bước để sử dụng là thêm ShelledBashEclipsepluggins vào nhật thực. Sau đó chạy thủ tục được cung cấp trong BashEclipse đọc tệp văn bản cho tôi để khởi động trình gỡ lỗ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.