2017-01-04 23 views
1

Мы запускаем squid из gdb - таким образом мы можем автоматически генерировать обратные трассировки для отладки.Запуск программы в gdb, но игнорирование изящного выхода?

backtrace=`mktemp` 
gdb -q -x /etc/service/squid3/gdbcommands /usr/sbin/squid 2>&1 >$backtrace 
/usr/bin/mail -s "`hostname`: Squid was restarted (backtrace)" [email protected] < backtracetrace 
rm $backtrace 

/и т.д./сервис/squid3/gdbcommands содержит:

set args -NsYC 
handle SIGPIPE pass nostop noprint 
handle SIGTERM pass nostop noprint 
handle SIGUSR1 pass nostop noprint 
handle SIGHUP pass nostop noprint 
handle SIGSEGV stop 
handle SIGABRT stop 
run 
set print pretty 
backtrace full 
generate-core-file 
quit 

Но, каждый сейчас и потом, кальмар "просто" остановки & перезапущен, без аварии будучи вовлеченным на всех , В этом случае я все еще получаю письмо, содержащее:

Reading symbols from /usr/sbin/squid...done. 
    [Thread debugging using libthread_db enabled] 
    Using host libthread_db library "/lib/x86_64-linux-gnu/libthread_db.so.1". 
    [Inferior 1 (process 57867) exited normally] 
    /etc/service/squid3/gdbcommands:10: Error in sourced command file: 
    No stack. 
    (gdb) quit 

И, конечно, нет стеки, так как программа вышла в порядке.

Как я могу изменить файл gdbcommands, чтобы этого избежать?

ответ

1

Это можно сделать с помощью Python или CLI gdb. Поскольку CLI немного проще, когда это возможно, я нарисую этот подход.

Во-первых, вы можете создать основной файл с плохим выходом. И позже мы будем использовать код выхода gdb, поэтому давайте организуем это, чтобы сообщить сценарию вызова, что произошло.

Где ваш текущий сценарий говорит:

backtrace full 
generate-core-file 
quit 

... вместо того, чтобы использовать:

if !$_isvoid($_exitsignal) || (!$_isvoid($_exitcode) && $_exitcode != 0)) 
    backtrace full 
    generate-core-file 
    quit 0 
end 
quit 1 

Затем ваш вызывающий скрипт может проверить код выхода БГД:

if gdb your args here; then 
    mail results 
fi