Làm thế nào tôi có thể bẫy một chương trình trả về 139 (lỗi phân đoạn) trong bash?


10

Tôi có một tập lệnh bash kiểm tra một số chương trình và một trong số các chương trình trả về Segmentation faultvì vậy tôi đã cố gắng thêm một cái bẫy vào đầu tập lệnh của mình:

trap "echo 'segfault occured!'" SIGSEGV

Tuy nhiên, điều đó không làm gì cả. Tôi đã sử dụng

echo $?

ngay sau chương trình tạo ra segfault và tôi nhận được 139 là đầu ra. Làm cách nào để thêm bẫy cho mã lỗi cụ thể đó?

Câu trả lời:


7

trap "$instructions" SIGSEGV bẫy lỗi phân đoạn trong chính vỏ.

Nếu bạn chạy tập lệnh của mình bên dưới set -e, bạn có thể đặt bẫy EXIT(hoặc 0). Nó sẽ được thực thi khi tập lệnh của bạn kết thúc (cho dù do lệnh trả về trạng thái khác không, hoặc bằng cách gọi rõ ràng exithoặc bằng cách rơi ra khỏi phần cuối của tập lệnh). Để kiểm tra lỗi phân đoạn, hãy kiểm tra $?khi vào bẫy. (Lưu ý rằng $?có thể là 139 vì chương trình trở lại bình thường với trạng thái 139; điều này là có thể tránh được nếu bạn thực hiện xử lý trong trình bao.)

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

Trong bash hoặc ksh hoặc zsh, bạn không cần sử dụng set -eđể thực hiện bẫy sau mỗi lệnh trả về trạng thái khác không, ERRthay vào đó bạn có thể đặt bẫy . Như trước đây, bạn cần kiểm tra $?khi vào bẫy và 139 có thể (nhưng hiếm khi) có nghĩa là chương trình trả về trạng thái này.


6

Từ man bash:

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

Khi chương trình của bạn tách biệt, bash của bạn chỉ nhận được SIGCHLDvì một số trẻ đã thoát (bằng mọi cách).

Tuy nhiên, bạn có thể sử dụng mã thoát, được lưu trữ $?trong một số điều kiện và bẫy SIGCHLD:

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

Lưu ý rằng set -bmcó thể cần thiết nếu điều này (những gì nó có thể làm) được sử dụng trong bash không tương tác (chẳng hạn như tập lệnh).

Chỉnh sửa: Xem thêm câu trả lời này (Gilles ') về một vấn đề tương tự bằng cách sử dụng bashtrap.


Một cái gì đó kỳ lạ xảy ra. Tôi sử dụng bẫy trap "echo 'something happened!'" {1..64}và tôi vẫn không nhận được bất cứ điều gì. Tôi thậm chí đã thử với set -bmset -o monitornhưng nada.
Pithikos

Bạn đã thử tương tác này? trap "echo 'something happened'" {1..31}làm việc cho tôi (bỏ qua !và những thông số tín hiệu dẫn đến bash: trap: XX: invalid signal specification).
sr_
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.