Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Autopsie d'un programme

5 réponses
Avatar
rixed
Hello !

J'ai un programme qui s'arrete au boud de deux jours de fonctionnements,
sans que j'arrive à trouver la raison. Sous gdb, j'ai simplement le
message 'programm exited with status 0377' (255 en décimal). Donc pas de
signal, comme si quelquepart il y avait un exit(255). Mais il n'y en a
pas dans le programme lui même, ni semble t-il dans les librairies utilisés
(je n'ai pas vérifié dans libc).

D'autre part, j'ai des fonctions atexit, dont l'une provoque d'ailleurs
un signal (division par zéro, dans le vain espoir de réveiller gdb), sur
lesquelles j'ai posé pleins de point d'arret.

Rien. Juste 'program exited with status 0377'.

Comme si, dans certains cas, l'OS (linux ici, en l'occurence) décidait de
tuer un programme comme ca, par distraction.

Toute idée sur ce qui peut provoquer ce comportement serait la
bienvenue.

Merci d'avoir lu.

5 réponses

Avatar
Nicolas George
wrote in message
:
J'ai un programme qui s'arrete au boud de deux jours de fonctionnements,
sans que j'arrive à trouver la raison. Sous gdb, j'ai simplement le
message 'programm exited with status 0377' (255 en décimal). Donc pas de
signal, comme si quelquepart il y avait un exit(255). Mais il n'y en a
pas dans le programme lui même, ni semble t-il dans les librairies utilisés
(je n'ai pas vérifié dans libc).


Je conseillerais volontiers de le lancer avec strace -i : ça affiche le
pointeur d'instruction à chaque appel système. Il est alors possible de
savoir où se produit l'appel système exact, et de placer un breakpoint très
précis (break *0x<adresse>) qui permettra d'avoir un backtrace avec gdb.

Avatar
Nicolas George
Nicolas George wrote in message <dogl7j$2rol$:
Je conseillerais volontiers de le lancer avec strace -i : ça affiche le
pointeur d'instruction à chaque appel système.


Petit détail : ça indique le pointeur d'instruction du retour de l'appel,
donc il faut prévoir un coup de disassemble autour de l'adresse en question
pour récupérer l'adresse de l'instruction précédente.

Avatar
ccellier
On 2005-12-23, Nicolas George <nicolas$ wrote:
Nicolas George wrote in message <dogl7j$2rol$:
Je conseillerais volontiers de le lancer avec strace -i : ça affiche le
pointeur d'instruction à chaque appel système.


Petit détail : ça indique le pointeur d'instruction du retour de l'appel,
donc il faut prévoir un coup de disassemble autour de l'adresse en question
pour récupérer l'adresse de l'instruction précédente.


Oui, j'y avait pensé. Ca m'ennuie un peu parceque ca va produire un output
gigantesque au bout de 2 jours, mais avec le fifo qui va bien pourquoi
pas. Je vais en arriver là si j'ai pas d'autres idées.


Avatar
Fred
Hello !

J'ai un programme qui s'arrete au boud de deux jours de fonctionnements,
sans que j'arrive à trouver la raison. Sous gdb, j'ai simplement le
message 'programm exited with status 0377' (255 en décimal). Donc pas de
signal, comme si quelquepart il y avait un exit(255). Mais il n'y en a
pas dans le programme lui même, ni semble t-il dans les librairies utilisés
(je n'ai pas vérifié dans libc).

D'autre part, j'ai des fonctions atexit, dont l'une provoque d'ailleurs
un signal (division par zéro, dans le vain espoir de réveiller gdb), sur
lesquelles j'ai posé pleins de point d'arret.

Rien. Juste 'program exited with status 0377'.

Comme si, dans certains cas, l'OS (linux ici, en l'occurence) décidait de
tuer un programme comme ca, par distraction.

Toute idée sur ce qui peut provoquer ce comportement serait la
bienvenue.

Merci d'avoir lu.




Extrait de la doc :
"La fonction exit() termine normalement le programme en cours. La valeur
status & 0377 est renvoyée au processus parent."

Il se peut donc qu'il s'agisse d'un exit avec n'importe quelle valeur
ayant ses 8 bits de poids faible à 1. Par exemple exit(-1), ou
return(-1) dans le main().

Ce ne peut pas être l'OS qui tue le programme sinon, soit tu recevrais
un signal, soit tu aurais 'program killed'

A+
Fred

Avatar
Laurent Wacrenier
écrit:
D'autre part, j'ai des fonctions atexit, dont l'une provoque d'ailleurs
un signal (division par zéro, dans le vain espoir de réveiller gdb), sur
lesquelles j'ai posé pleins de point d'arret.


utilise plutot abort().

Rien. Juste 'program exited with status 0377'.


C'est un appel à _exit(-1) mais il peut être dissimulé.

Comme si, dans certains cas, l'OS (linux ici, en l'occurence) décidait de
tuer un programme comme ca, par distraction.


Normalement non, il y aurait réception d'un signal.