# Restarter avec GDB

**URL:** <https://www.debian-fr.org/t/restarter-avec-gdb/55713>\
**Category:** Programmation\
**Created:** [Février 21, 2016, 1:47 UTC](https://www.debian-fr.org/t/restarter-avec-gdb/55713 "2016-02-21T13:47:04Z")\
**Posts on this page:** 16\
**Page:** 1

<div class="post-metadata">

**Author:** ![Belarrius](https://www.debian-fr.org/user_avatar/www.debian-fr.org/belarrius/32/3325_2.png) [@Belarrius](https://www.debian-fr.org/u/Belarrius)\
**Post date:** [Février 21, 2016, 1:47 UTC](https://www.debian-fr.org/t/restarter-avec-gdb/55713/1 "2016-02-21T13:47:04Z")

</div>

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](https://www.debian-fr.org/uploads/default/original/1X/e72d3b45191f9b2363aa21bfae6f42497bc4042b.gif "yeux-coeur")

---

<div class="post-metadata">

**Author:** ![Eho](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/e/eb8c5e/32.png) [@Eho](https://www.debian-fr.org/u/Eho)\
**Post date:** [Février 21, 2016, 1:47 UTC](https://www.debian-fr.org/t/restarter-avec-gdb/55713/2 "2016-02-21T13:47:06Z")

</div>

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.

---

<div class="post-metadata">

**Author:** ![MisterFreez](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/m/bb73d2/32.png) [@MisterFreez](https://www.debian-fr.org/u/MisterFreez)\
**Post date:** [Février 21, 2016, 1:47 UTC](https://www.debian-fr.org/t/restarter-avec-gdb/55713/3 "2016-02-21T13:47:07Z")

</div>

> [@](#):
>
> Il faut bien que ton programme soit compilé avec l’option de debug et sans optimisation de préférence «-O0 -g3».

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.

---

<div class="post-metadata">

**Author:** ![fran.b](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/f/d78d45/32.png) [@fran.b](https://www.debian-fr.org/u/fran.b)\
**Post date:** [Février 21, 2016, 1:47 UTC](https://www.debian-fr.org/t/restarter-avec-gdb/55713/4 "2016-02-21T13:47:08Z")

</div>

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)

---

<div class="post-metadata">

**Author:** ![Belarrius](https://www.debian-fr.org/user_avatar/www.debian-fr.org/belarrius/32/3325_2.png) [@Belarrius](https://www.debian-fr.org/u/Belarrius)\
**Post date:** [Février 21, 2016, 1:47 UTC](https://www.debian-fr.org/t/restarter-avec-gdb/55713/5 "2016-02-21T13:47:10Z")

</div>

Merci pour toutes vos réponses !

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

Voici mon bash

```auto
#!/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é.

---

<div class="post-metadata">

**Author:** ![Belarrius](https://www.debian-fr.org/user_avatar/www.debian-fr.org/belarrius/32/3325_2.png) [@Belarrius](https://www.debian-fr.org/u/Belarrius)\
**Post date:** [Février 21, 2016, 1:47 UTC](https://www.debian-fr.org/t/restarter-avec-gdb/55713/6 "2016-02-21T13:47:11Z")

</div>

[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]

---

<div class="post-metadata">

**Author:** ![MisterFreez](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/m/bb73d2/32.png) [@MisterFreez](https://www.debian-fr.org/u/MisterFreez)\
**Post date:** [Février 21, 2016, 1:47 UTC](https://www.debian-fr.org/t/restarter-avec-gdb/55713/7 "2016-02-21T13:47:11Z")

</div>

[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 :

```auto

```

et dans le fichier fichierBatch (par exemple) :

`run
list
exit`

Edit : simplification

---

<div class="post-metadata">

**Author:** ![Belarrius](https://www.debian-fr.org/user_avatar/www.debian-fr.org/belarrius/32/3325_2.png) [@Belarrius](https://www.debian-fr.org/u/Belarrius)\
**Post date:** [Février 21, 2016, 1:47 UTC](https://www.debian-fr.org/t/restarter-avec-gdb/55713/8 "2016-02-21T13:47:13Z")

</div>

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](http://watchdog.sh), le fichierBatch et ia bien le binaire mega présent dans le même dossier.

---

<div class="post-metadata">

**Author:** ![MisterFreez](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/m/bb73d2/32.png) [@MisterFreez](https://www.debian-fr.org/u/MisterFreez)\
**Post date:** [Février 21, 2016, 1:48 UTC](https://www.debian-fr.org/t/restarter-avec-gdb/55713/9 "2016-02-21T13:48:35Z")

</div>

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]

---

<div class="post-metadata">

**Author:** ![syam](https://www.debian-fr.org/user_avatar/www.debian-fr.org/syam/32/2951_2.png) [@syam](https://www.debian-fr.org/u/syam)\
**Post date:** [Février 21, 2016, 1:48 UTC](https://www.debian-fr.org/t/restarter-avec-gdb/55713/10 "2016-02-21T13:48:35Z")

</div>

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

[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]

---

<div class="post-metadata">

**Author:** ![MisterFreez](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/m/bb73d2/32.png) [@MisterFreez](https://www.debian-fr.org/u/MisterFreez)\
**Post date:** [Février 21, 2016, 1:48 UTC](https://www.debian-fr.org/t/restarter-avec-gdb/55713/11 "2016-02-21T13:48:35Z")

</div>

![:doh:](https://www.debian-fr.org/uploads/default/original/1X/78536cf08b5cbccb06a10e44ddb8da50bfc1554d.gif "Doh!") le dieu script n’est pas avec moi aujourd’hui, il est temps d’aller dormir. 😊

---

<div class="post-metadata">

**Author:** ![Belarrius](https://www.debian-fr.org/user_avatar/www.debian-fr.org/belarrius/32/3325_2.png) [@Belarrius](https://www.debian-fr.org/u/Belarrius)\
**Post date:** [Février 21, 2016, 1:48 UTC](https://www.debian-fr.org/t/restarter-avec-gdb/55713/12 "2016-02-21T13:48:35Z")

</div>

Merci beaucoup !

Ça avance ! ![:007](https://www.debian-fr.org/uploads/default/original/1X/e72d3b45191f9b2363aa21bfae6f42497bc4042b.gif "yeux-coeur")

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

```auto
/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 🙂

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

Merci par avance !

---

<div class="post-metadata">

**Author:** ![MisterFreez](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/m/bb73d2/32.png) [@MisterFreez](https://www.debian-fr.org/u/MisterFreez)\
**Post date:** [Février 21, 2016, 1:48 UTC](https://www.debian-fr.org/t/restarter-avec-gdb/55713/13 "2016-02-21T13:48:37Z")

</div>

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

Vire le exit du batch il sert à rien.

---

<div class="post-metadata">

**Author:** ![Belarrius](https://www.debian-fr.org/user_avatar/www.debian-fr.org/belarrius/32/3325_2.png) [@Belarrius](https://www.debian-fr.org/u/Belarrius)\
**Post date:** [Février 21, 2016, 1:48 UTC](https://www.debian-fr.org/t/restarter-avec-gdb/55713/14 "2016-02-21T13:48:38Z")

</div>

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

---

<div class="post-metadata">

**Author:** ![Belarrius](https://www.debian-fr.org/user_avatar/www.debian-fr.org/belarrius/32/3325_2.png) [@Belarrius](https://www.debian-fr.org/u/Belarrius)\
**Post date:** [Février 21, 2016, 1:48 UTC](https://www.debian-fr.org/t/restarter-avec-gdb/55713/15 "2016-02-21T13:48:39Z")

</div>

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

Rustique mais fonctionnel ! ![:118](https://www.debian-fr.org/uploads/default/original/1X/d1e19597f004a3fd88435bfd0efb9a00e740a16a.gif "langue-yeux") ![:041](https://www.debian-fr.org/uploads/default/original/1X/bfe857c9119752799c3eac55ca37a50312c51282.gif "applaudit")

Merci à vous tous ! Je considère mon problème comme résolut ! ![:030](https://www.debian-fr.org/uploads/default/original/1X/65b1b73704eec538091c0e1d04a633b3840a284f.gif "picole")

---

<div class="post-metadata">

**Author:** ![syam](https://www.debian-fr.org/user_avatar/www.debian-fr.org/syam/32/2951_2.png) [@syam](https://www.debian-fr.org/u/syam)\
**Post date:** [Février 21, 2016, 1:48 UTC](https://www.debian-fr.org/t/restarter-avec-gdb/55713/16 "2016-02-21T13:48:42Z")

</div>

[quote=«&nbsp;Belarrius&nbsp;»]`/home/server/mega/bin/fichierBatch:3: Error in sourced command file:
Undefined command: "exit". Try "help".`[/quote][quote=«&nbsp;MisterFreez&nbsp;»]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:](https://www.debian-fr.org/uploads/default/original/1X/cc83e9b583138e48ff45f96609046b06d06c7f9d.gif "Mr. Green")
