Bash betiği nasıl hata ayıklanır?


31

Bash betiğini yankı ve günlük kullanmadan hata ayıklamanın bir yolu var mı?

Kesme noktalarını ve bunun gibi şeyleri kullanmaktan bahsediyorum.

Yanıtlar:



20

Birkaç farklı yol var, yani:

  • Komut dosyanızı -x seçeneğiyle çalıştırın

    bash -x yourscript.sh
  • set -xShebang'dan sonra ve betiğinizin #!/bin/bashbaşlangıcından önce script dosyanızın başına yeni bir satır ekleyin set -v, kabuk giriş satırlarını set -xgösterir, yürütülen komutları ve argümanları görüntüler

  • script dosyanızın shebang’ını değiştirin #!/bin/bash -xv




4

Bu küçük işlevi, "konsol" içine bırakmak için kullanabilirsiniz:

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

Ardından, komut dosyanızın içinde (ÖRNEK):

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

Yerel değişkenleri sağlam tutan herhangi bir komutu kabul eder. "Hata ayıklama" modundan çıkmak için, "exit" yazın (koddan çıkmaz) ve kodla devam eder. Bir döngü içinde "hata ayıklama" kullanırsanız, her zaman duracaktır. Bir "if" (yukarıdaki örnekte olduğu gibi) içine sarabilir veya bir "izle" işlevi oluşturabilirsiniz:

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

# And Use it:

debug_watch "$file" "strange_case.txt"

Ayrıca mevcut tüm değişkenleri ve değerlerini boşa çıkaran "vars" komutunu da ekledim. Kendi özelleştirilmiş komutlarınızı da ekleyebilirsiniz.

Kodu birkaç dakika içinde yaptım, bu yüzden kendi risk altında kullanın. Hata ayıklama modunda herhangi bir komutun çalıştırılabileceğini unutmayın; bu nedenle bir üretim komut dosyasında bırakırsanız güvenlik riski oluşturur.


3
Büyük harfli değişken isimleri kullanmaktan kaçının. Özel kabuk değişkenlerini ve çevre değişkenlerini geçersiz kılma riskiniz. Ayrıca, sonuçta ortaya çıkan sözcük bölünmesini ve yol adı genişlemesini önlemek için, parametre genişletmelerini bağımsız değişken olarak kullandıklarında alıntı yaptığınızdan emin olun. örneğin * ) eval "$cmd" ;;ve debug_watch "$file" strange_case.txt.
geirha

Geirha tarafından önerilen şekilde düzenlenmiş kod.
lepe

2

NES'in söylediklerine göre bash'ta hata ayıklamaya izin veren bayraklar yerleştirilmiş.

set -xBayrak set ve unset ya terminalden veya komut dosyası içinde olabilir. +Veya kullanarak -:

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

İşte setkomutların yaptığı:

  • set -f Meta karakterleri kullanarak dosya adı oluşturmayı devre dışı bırakın.
  • set -v (Ayrıntılı) kabuk giriş satırlarını okunduğu gibi yazdırır.
  • set -x Komutu çalıştırmadan önce komut izlerini yazdırın.

setaslında birçok özelliğe sahip, ancak alet içinde yerleşik bir kabuk olduğu için hiçbir şekilde man sayfa yok. Küme el kitabı GNU Bash belgelerindedir .

Programınız hakkında ayrıntılı bilgi edinmenize yardımcı olabilecek çok sayıda komut satırı aracı vardır:

  • stat dosya veya dosya sistemi durumunu göster
  • file bir dosya türü belirler.
  • hexdump belirtilen dosyaları çeşitli formatlarda görüntüleyen filtre
  • nohup Asmayacak bir komut dosyası çalıştır

    ve diğerleri. Gizli karakterleri gösteren komutu düşünmeye çalışıyordum, ama şu anda yapamam. Hexdump yapacak ama daha iyi bir tane var.

Anahtar komutu ctrl\ , çalışan bir program veya komut dosyasının çekirdek dökümüne neden olur. O zaman bu bağımlılığı analiz edebilirsin. Muhtemelen bir coredump'i analiz etmek için gdb'yi kullanırdım, fakat bunun için pek çok program var.

Bash kabuğunda hata ayıklamak için de şık seçenekler var. seçenekler --debugger, -vayrıntılı bilgiler --dump-stringsve size yardımcı olacak diğer şık seçenekler. Kullanarak onları kontrol edin man bash.

trapKomutu (yerleşik kabuk) sizin için çok yararlı olabilir. tuzak diyor ki eğer programınız beklenmedik bir şekilde çıkarsa, bir şeyler yürütün. Burada tuzak ve diğer kullanışlı Bash Shell yerleşiklerini okuyorsun .

Genel olarak şu an için konuşan, hata ayıklama herhangi bir dilde büyük bir konudur. Herhangi bir programlama dilinde hata ayıklamak için kullanışlı olabilecek diğer bazı başlıklar arasında kabuk yeniden yönlendirme ve sinyal işleme bulunur.

Sonunda, kullandığım örneğin önemsiz olduğunu fark ettim, ancak bazı kabuk komut dosyalarının yüzlerce satır olabileceğini biliyorum. Bu durumlarda, yorum etiketleri eklemeyi ve hatalı olduğundan şüphelendiğim kodu engellemeyi ya da Alternatif olarak, bir çıkış komutu eklemeyi ve işlevsel kodu bir bölme ve fethetme tekniğini kullanarak bozuk koddan ayırmayı denemeyi seviyorum.


1

Bir bash betiğini hata ayıklamak için bir GUI seçeneği BashEclipse / Shelled eklentileri olan Eclipse IDE'dir.

Bu, sorunuzun özelliklerini verir (breakpoints and stuff ) özelliklerini karmaşık bash komut dosyalarında hata ayıklamak için bir dizi başka özellikle birlikte .

Özelliklerden bazıları şunlardır:
( https://unix.stackexchange.com/questions/155551/how-to-debug-a-bash-script )

  • Kırılma Noktası geçişi
  • Tek Adım Adım İşlem
  • Step-in, Step-out, Step-over fonksiyonları ve alt rutinleri
  • Kod değişkenlerini kod çalışırken herhangi bir noktada incelemek
  • TODO görev listesi
  • Yer imi listesi
  • Birden Çok Pencere Düzenleme
  • Proje ortamının uzaktan paylaşılması

Komut Dosyası Düzenleyicisi perspektifi: Eclipse Komut Dosyası IDE

Hata ayıklama bakış açısı: Eclipse Komut Dosyası Hata Ayıklama Perspektif

Kullanma adımları , tutulması için Shelledve BashEclipseeklentileri eklemektir. Ardından, hata ayıklayıcısını başlatmak için BashEclipse bana verilen metin dosyasını oku prosedürünü çalıştırın.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.