139 (bölümleme hatası) döndüren bir programı bash'da nasıl yakalayabilirim?


10

Bazı programları test eden bir bash betiği var ve betiğimin Segmentation faultbaşına bir tuzak eklemeye çalıştığım programlardan biri geri dönüyor :

trap "echo 'segfault occured!'" SIGSEGV

Ancak bu hiçbir şey yapmadı. kullandım

echo $?

segfault üreten programın hemen ardından 139 çıktı alırım . Söz konusu hata kodu için nasıl bir tuzak ekleyebilirim?

Yanıtlar:


7

trap "$instructions" SIGSEGV segmentasyon hatalarını kabukta hapseder.

Komut dosyanızı altında çalıştırırsanız set -e, EXIT(veya 0) üzerine bir tuzak koyabilirsiniz . Komut dosyanız sona erdiğinde (sıfır olmayan bir durum döndüren bir komut nedeniyle veya açıkça çağrılarak exitveya komut dosyasının sonundan düşerek) yürütülür . Segmentasyon hatasını test $?etmek için tuzağa girişi kontrol edin . ( $?Program normal olarak 139 durumuyla döndüğünden 139 olabileceğini unutmayın ; işleminizi kabukta yaparsanız bu önlenebilir.)

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

Bash veya ksh veya zsh'de, set -esıfır olmayan bir durum döndüren her komuttan sonra bir tuzak yürütmek için kullanmanıza gerek yoktur , ERRbunun yerine bir tuzak koyabilirsiniz . Daha önce olduğu gibi $?, tuzağa girişi kontrol etmeniz gerekir ve 139, programın bu durumu döndürdüğü anlamına gelebilir (ancak nadiren anlamına gelir).


6

Gönderen man bash:

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

Programınız hata verdiğinde, bashınız bir SIGCHLDçocuk alır (çünkü herhangi bir şekilde).

Ancak, $?bazı koşullu ve tuzaklarda saklanan çıkış kodunu kullanabilirsiniz SIGCHLD:

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

set -bmBu (büyük olasılıkla yaptığı şey) etkileşimli olmayan bir bash (komut dosyası gibi) kullanılırsa gerekli olabileceğini unutmayın .

Düzenleme: Ayrıca bkz . Ve kullanarak benzer bir konuda bu (Gilles ') cevabı .bashtrap


Tuhaf bir şey olur. Tuzak kullanıyorum trap "echo 'something happened!'" {1..64}ve hala hiçbir şey alamıyorum. Hatta ile tryied set -bmve set -o monitorancak bitik.
Pithikos

Bunu etkileşimli olarak denediniz mi? trap "echo 'something happened'" {1..31}benim için çalışıyor ( !ve bu sinyal özelliklerini dışarıda bırakarak bash: trap: XX: invalid signal specification).
sr_
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.