Restarter avec GDB

Bonjour, Bonsoir à toutes & tous !

Infos : Debian Squeeze, kernel 3.2.13 64bits - Sans Interface Graphique

Façons court : (mon programme est lancer via gdb, il crash, je ne sais pas comment obtenir le rapport en plus du relancement au tomatique)


Façons longue
:

Alors voilà, j’ai un programme à faire tourner, il crash souvent, et est lancer via un petit bash qui le restart automatiquement.

Seulement, je le lance régulièrement avec gdb pour avoir des rapport de crash afin de régler les soucis au fur et à mesure. Mon soucis ce situe sur le fait que je ne c’est pas comment faire pour avoir un rapport de crash gdb (commande “bt” une fois l’appli crasher) tout en redémarrant l’application.

Chers Debianneurs, je requiert votre aide ! Merci par avance ! :007

Réponse rapide:

Lorsque ton programme plante avec gdb, tu peux taper «up» pour remonter l’appel des fonctions.
Tu peux aussi afficher des variables avec «print variable».
Il faut bien que ton programme soit compilé avec l’option de debug et sans optimisation de préférence «-O0 -g3».

Il serait peut être plus judicieux de lancer ton programme avec valgrind qui te donnera un rapport détaillé sur les mauvaises utilisations des variables et des tableaux.

Pour avoir le maximum d’infos avec gdb, tu peut mettre -ggdb3.

Sinon tu peut activer les coredump, faire en sorte que ton script shell ne garde que le dernier (ou les X derniers) core et faire une analyse post-mortem via gdb.

Si j’ai bien compris, tu veux lancer gdb en batch en répétant une même série d’actions à chaque plantage. Utilise l’option --batch de gdb, elle est faite pour ça.

Genre: #!/bin/bash while /bin/true; do gdb -batch -n -x Fichier_de_commandes programme argument >> /tmp/log done (Le -n évite un éventuel fichier init de gdb)

Merci pour toutes vos réponses !

Le programmes est compiler avec un “cmake -DDEBUG=1”

Voici mon bash

#!/bin/bash

bindir=/home/server/mega/bin/
worldd=mega
crashlog=/home/server/mega/log/Restarter.log
serverlog=/home/server/mega/log/Server.log

# Restarter
echo "-----------------------"
echo "Restarter - CTRL A + D"
echo "-----------------------"
echo
sleep 1

cd $bindir

while [ 1 == 1 ]
do
    ./$worldd
    echo
    echo "crash, redemarage dans 5 secondes.."
    sleep 5
    date=$(date "+%Y-%m-%d %H:%M:%S")
        echo $date mega crashed >> $crashlog
    echo "" >> $crashlog
    tail -n20 $serverlog >> $crashlog
    echo "" >> $crashlog
    echo "Redemarage.."
    echo
done

Je me suis inspiré d’un script existant, je ne suis pas encore doué.

[quote=“fran.b”]Si j’ai bien compris, tu veux lancer gdb en batch en répétant une même série d’actions à chaque plantage. Utilise l’option --batch de gdb, elle est faite pour ça.

Genre: #!/bin/bash while /bin/true; do gdb -batch -n -x Fichier_de_commandes programme argument >> /tmp/log done (Le -n évite un éventuel fichier init de gdb)[/quote]

Sa m’a l’air sympathique, je vais essayer d’utiliser ça

Edit: Je sais pas comment l’utiliser … J’ai mis mon bash deden, ou même le programme,

[code]/home/server/mega/bin/restarter:4: Error in sourced command file:
Undefined command: “bindir”. Try “help”.

[/code]

[code]#!/bin/sh

crashlog=’/home/server/mega/log/Restarter.log’

if [ -f “$1” ] && [ -x “$2” ]; then
cat <<EOF
Usage : $0 batch prog
batch : batch gdb
prog : programme à surveiller
EOF
exit 1
fi

while true ; do
echo "Nouvelle exécution "$(date) >> "${crashlog}"
gdb -batch -n -x “$1” “$2” >> "${crashlog}"
sleep 5
done[/code]

À utiliser ainsi :

et dans le fichier fichierBatch (par exemple) :

run list exit

Edit : simplification

Merci beaucoup !

J’ai suivis il me semble correctement tout ceci, au lancement il persiste avec :

Usage : ./watchdog.sh batch prog batch : batch gdb prog : programme à surveiller

j’ai bien créer et remplis le watchdog.sh, le fichierBatch et ia bien le binaire mega présent dans le même dossier.

C’est ma faute :

[code]#!/bin/sh

crashlog=’/home/server/mega/log/Restarter.log’

if [ ! -f “$1” ] || [ ! -x “$2” ]; then
cat <<EOF
Usage : $0 batch prog
batch : batch gdb
prog : programme à surveiller
EOF
exit 1
fi

while true ; do
echo "Nouvelle exécution "$(date) >> "${crashlog}"
gdb -batch -n -x “$1” “$2” >> "${crashlog}"
sleep 5
done[/code]

Allez je vais faire mon chieur : et les arguments du programme, ils puent du bec ? :wink:

[code]#!/bin/sh

crashlog=’/home/server/mega/log/Restarter.log’

if [ ! -f “$1” ] || [ ! -x “$2” ]; then
cat <<EOF
Usage : $0 batch prog [arguments de prog…]
batch : batch gdb
prog : programme à surveiller
EOF
exit 1
fi

BATCH_GDB="$1"
shift
while true ; do
echo "Nouvelle exécution "$(date) >> "${crashlog}"
gdb -batch -n -x “$BATCH_GDB” --args “$@” >> "${crashlog}"
sleep 5
done[/code]

:doh: le dieu script n’est pas avec moi aujourd’hui, il est temps d’aller dormir. :blush:

Merci beaucoup !

Ça avance ! :007

Donc à présent lorsque je fais “./watchdog.sh fichierBatch mega” le programme ce lance, lorsqu’il crash il redémarre bien mais avec ce message

/home/server/mega/bin/fichierBatch:3: Error in sourced command file:
Undefined command: "exit".  Try "help".

Puis il entame le redémarrage.

Dans home/server/mega/log j’ai bien le fichier Restarter.log créer, mais il ne contiens que la console du programme, aucun rapport gdb.

J’avais pour habitude de faire comme suit : “./gdb mega” crash > “bt” et la j’avais le rapport qui était utile :slightly_smiling:

Il n’est pas possible dans le Restarter.log d’avoir ce fameux log du bt justement ?

Merci par avance !

Je viens d’essayer j’ai l’inverse dans le log… :unamused:

Vire le exit du batch il sert à rien.

Salutations !

En fait ça marche, c’est juste l’affichage console du programme qui flood absolument tout le log. Au lieux d’avoir juste le gdb j’ai gdb + le programme qui me fais 1 000 lignes de log !

Je vais voir si je peut arranger ça

Bon en fait, j’ai fais un mega echo pour repérer facilement l’endroit dans log du crash xD

Rustique mais fonctionnel ! :118 :041

Merci à vous tous ! Je considère mon problème comme résolut ! :030

[quote=“Belarrius”]/home/server/mega/bin/fichierBatch:3: Error in sourced command file: Undefined command: "exit". Try "help".[/quote][quote=“MisterFreez”]Vire le exit du batch il sert à rien.[/quote]
En fait la bonne commande c’est quit pas exit. Après, j’ai pas l’habitude de gdb en batch donc effectivement si c’est pas utile, pourquoi se faire chier ? :mrgreen: