Closed OlivierMarty closed 9 years ago
Aah on en parlait toute à l'heure, je pensais être le seul à avoir le problème.
Ca serait bien que t'essaies d'avoir une backtrace si tu peux, je ne peux pas l'avoir de mon côté puisque je suis obligé de kill gdb lorsque le jeu crashe (pas moyen d'alt-tab en dehors du jeu en plein écran sur ma debian, et le bug ne se produit qu'en plein écran).
Moi aussi le tout freeze avec gdb, j'ai néanmoins récupérer ceci :
Program received signal SIGSEGV, Segmentation fault.
0x000000000041e63c in camlGame__fun_2466 () at src/interface/Game.ml:416
416 last_event <- Unix.gettimeofday() +. 0.2
J'ai juste fait run
, s'il y a d'autres commande à faire pour avoir plus de détail je ne les connais pas mais je veux bien les faire !
C'est donc moi qui ait introduit ce bug ? C'est vraiment étrange… Surtout que je ne touche pas à Game.ml...
Est-ce qu'en désactivant l'affichage de l'image ou les boutons ou en transformant — par exemple — la fonction frame_incr
en un vulgaire
method frame_incr =
frame_counter <- frame_counter + 1
vous avez toujours le problème ?
(Je ne peux pas tester, chez moi le son peut se changer sans problème).
C'est quand même bizarre d'introduire une segfault.
Bon, apparemment le bug ne vient pas des fonctions d'animations, mais juste lors du matching sur les events S et D. Si on enlève les KeyPressed S et D on n'a plus de problème. Le bug a l'air de venir de Debian...
Plus précisément, le problème vient uniquement de l'event KeyPressed D (et pas S), avec toutes les combinaisons de touches Fn + Key.
Encore des nouveautés : en fait, le bug ne vient pas de la touche D, mais juste du nombre de touches qu'on matche. En fait, à partir du moment où on matche plus de 12 touches, ça segfault. Il est marrant ce bug :)
Si vous voulez vous amuser avec ce bug, allez voir là :
https://gist.github.com/VLanvin/59aa651a6f5fb42fce39
Ce sont 4 variations sur le code minimal. Le code est à chaque fois plus ou moins instable, le moindre changement peut faire quelque chose de radicalement différent.
Explications : En fait, la combinaison Fn + ... est rattrapée comme une valeur "-1" par SFML, correspondant à la touche Unknown. Le fait est que dans la Ocsfml comme dans la SFML, le -1 est simplement casté vers l'énumération des touches (A | B | C ...). Or, SFML commence l'énumération par Unknown, et fixe l'indice initial comme -1 donc le cast se passe bien. Mais en Ocaml, le premier élément d'un type énumération est toujours représenté par 0, donc caster le -1 vers le type se passe très mal, et donne un comportement complètement aléatoire dans le code machine. D'où le fait que le code soit complètement instable et que le bug ne dépende d'aucun paramètre identifiable. De plus, sous Debian, la combinaison Fn + ... n'est rattrapée qu'en Fullscreen, sinon elle est gérée directement par l'OS et n'est pas transmise au programme.
J'obtiens un core dumped lorsque j'appuis sur un des boutons de sons (plus fort/moins fort/muet) de mon ordinateur, uniquement en mode jeu, pas dans le menu donc. D'après un git bisect, le bug est apparu au commit 831a4bb2490bc9ff4292280ec703bd9ba1e5d574.