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

Débuguer un problème de select()

6 réponses
Avatar
Olivier Miakinen
Bonjour,

Je dois débuguer à distance un problème de plantage sur un select()
et j'aimerais savoir comment m'y prendre, sachant que je n'ai ni accès
à la machine ni à la totalité du code source.

En gros, c'est un programme qui fonctionne correctement tant que sa
config n'est pas trop grosse, mais qui plante sur le select() quand
elle dépasse *approximativement* une taille donnée. Je n'ai pas encore
le errno en retour du select() mais j'attends que l'utilisateur me le
donne (en espérant que ça m'éclaire sur le problème rencontré).

À priori, je ne comprends pas pourquoi le nombre de file descriptors
varierait en fonction de la taille de la config : le programme est
censé lire quelques fichiers de config (peut-être deux ou trois,
guère plus) et avoir 5 sockets ouvertes : une en TCP/IPv4, deux en
UDP/IPv4 et deux en UDP/IPv6. La taille de la config est le nombre
d'adresses distantes accédées en UDP, mais cela n'augmente pas le
nombre de sockets ouvertes (chacune des deux sockets IPv4 pouvant
servir pour toutes les adresses IPv4, et idem pour IPv6).

Outre le errno en retour du select(), je voudrais demander des infos
à l'utilisateur, mais je ne sais pas ce qui pourrait m'être utile.
Par exemple, une recherche sur la toile m'a fait penser que je
pourrais demander peut-être « ulimit -Ha », « ulimit -Sa » et
« lsof | grep "^nom_du_programme" » mais je ne suis pas sûr de
savoir ce qui sera pertinent. Soit dit en passant, le programme
a le setuid bit positionné (avec owner root), et du coup je ne
sais pas si ulimit doit être lancé par l'utilisateur lambda ou
en root.

Merci de toute aide que vous pourriez m'apporter, ne serait-ce
qu'en me posant des questions sur ce que j'aurais omis de préciser
dans cet article...

Cordialement,
--
Olivier Miakinen

6 réponses

Avatar
Marc Boyer
Le 18-05-2015, Olivier Miakinen <om+ a écrit :
Bonjour,

Je dois débuguer à distance un problème de plantage sur un select()
et j'aimerais savoir comment m'y prendre, sachant que je n'ai ni accès
à la machine ni à la totalité du code source.


[SNIP]
Outre le errno en retour du select(), je voudrais demander des infos
à l'utilisateur, mais je ne sais pas ce qui pourrait m'être utile.



Est-ce que tu connais strace ?

Marc Boyer
--
"On est tout surpris, un beau soir, de trouver la satiété où
l'on cherchait le bonheur", [Beaumarchais, Mar. de Figaro, V, 7]
Avatar
Olivier Miakinen
Bonjour Marc,

Le 19/05/2015 14:44, Marc Boyer m'a répondu :

Je dois débuguer à distance un problème de plantage sur un select()
et j'aimerais savoir comment m'y prendre, sachant que je n'ai ni accès
à la machine ni à la totalité du code source.


[SNIP]
Outre le errno en retour du select(), je voudrais demander des infos
à l'utilisateur, mais je ne sais pas ce qui pourrait m'être utile.



Est-ce que tu connais strace ?



J'en avais entendu parler, mais je ne l'ai jamais utilisé et je n'y
pensais pas. Ça me semble effectivement une excellente idée, même si
sur ma machine de test (avec une config *beaucoup* plus petite que
chez l'utilisateur) ça m'a fait près de 5 500 lignes de traces avant
le premier select(). ;-)

Par ailleurs, je viens de lire le man de strace, et j'y vois :
<cit.>
BUGS
Programs that use the setuid bit do not have effective user ID
privileges while being traced.
</cit.>
... or justement le programme à tracer est dans ce cas.

Du coup, est-ce que tu me conseillerais de lancer strace en étant root,
ou bien de lui mettre aussi le setuid bit ?


Cordialement,
--
Olivier Miakinen
Avatar
Marc Boyer
Le 20-05-2015, Olivier Miakinen <om+ a écrit :
Est-ce que tu connais strace ?



J'en avais entendu parler, mais je ne l'ai jamais utilisé et je n'y
pensais pas. Ça me semble effectivement une excellente idée, même si
sur ma machine de test (avec une config *beaucoup* plus petite que
chez l'utilisateur) ça m'a fait près de 5 500 lignes de traces avant
le premier select(). ;-)



Et oui... Mais bon, plutôt que de demander plein de trucs à l'utilisateur,
on lui demande de lancer une seule commande.

Par ailleurs, je viens de lire le man de strace, et j'y vois :
<cit.>
BUGS
Programs that use the setuid bit do not have effective user ID
privileges while being traced.
</cit.>
... or justement le programme à tracer est dans ce cas.

Du coup, est-ce que tu me conseillerais de lancer strace en étant root,
ou bien de lui mettre aussi le setuid bit ?



Heuh... Essaye avec les deux et regarde les différences ;-)


--
"On est tout surpris, un beau soir, de trouver la satiété où
l'on cherchait le bonheur", [Beaumarchais, Mar. de Figaro, V, 7]
Avatar
Benoit Izac
Olivier Miakinen <om+ writes:

Est-ce que tu connais strace ?



J'en avais entendu parler, mais je ne l'ai jamais utilisé et je n'y
pensais pas. Ça me semble effectivement une excellente idée, même si
sur ma machine de test (avec une config *beaucoup* plus petite que
chez l'utilisateur) ça m'a fait près de 5 500 lignes de traces avant
le premier select(). ;-)



strace -e select te donnera le premier select ainsi que les suivants.
Après, même avec beaucoup de lignes, en mettant la sortie dans un
fichier suivi de quelques grep dessus, on arrive généralement assez vite
à trouver ce que l'on cherche (si c'est bien sur un appel _système_ que
ça coince).

--
Benoit Izac
Avatar
Olivier Miakinen
Le 20/05/2015 17:13, Marc Boyer m'a répondu :

Est-ce que tu connais strace ?



J'en avais entendu parler, mais je ne l'ai jamais utilisé et je n'y
pensais pas. Ça me semble effectivement une excellente idée, même si
sur ma machine de test (avec une config *beaucoup* plus petite que
chez l'utilisateur) ça m'a fait près de 5 500 lignes de traces avant
le premier select(). ;-)



Et oui... Mais bon, plutôt que de demander plein de trucs à l'utilisateur,
on lui demande de lancer une seule commande.



Excellente remarque.

Par ailleurs, je viens de lire le man de strace, et j'y vois :
[bug si setuid]

Du coup, est-ce que tu me conseillerais de lancer strace en étant root,
ou bien de lui mettre aussi le setuid bit ?



Heuh... Essaye avec les deux et regarde les différences ;-)



;-)

Bon, je vais espérer que ça fonctionne si on le lance en étant root
car ce sera plus simple à expliquer à l'utilisateur. Mais tu as
raison, je vais faire le test moi-même. Je demandais juste au cas
où tu aurais eu des lumières sur le sujet.

Cordialement,
--
Olivier Miakinen
Avatar
Olivier Miakinen
Le 20/05/2015 23:46, Benoit Izac m'a répondu :

Est-ce que tu connais strace ?



J'en avais entendu parler, mais je ne l'ai jamais utilisé et je n'y
pensais pas. Ça me semble effectivement une excellente idée, même si
sur ma machine de test (avec une config *beaucoup* plus petite que
chez l'utilisateur) ça m'a fait près de 5 500 lignes de traces avant
le premier select(). ;-)



strace -e select te donnera le premier select ainsi que les suivants.



Oui, j'ai vu ça, mais le select tout seul ne me sera pas très utile si
je n'ai pas les socket, open, close, etc. qui précèdent, ainsi sans
doute que les setsockopt, bind, connect, sendto, et peut-être d'autres
appels auxquels je ne pense pas. Bref, je vais plutôt tout demander au
risque d'avoir un fichier très gros, et...

Après, même avec beaucoup de lignes, en mettant la sortie dans un
fichier suivi de quelques grep dessus, on arrive généralement assez vite
à trouver ce que l'on cherche



... oui, exactement.

(si c'est bien sur un appel _système_ que ça coince).



Je sais déjà par d'autres traces que c'est le select qui échoue,
simplement je ne sais pas encore pourquoi (j'attends toujours la
réponse de l'utilisateur). En tout cas, encore merci à toi et à
Marc pour ces premières idées.

Cordialement,
--
Olivier Miakinen