GL-MPRI-2014 / Ocawai

OCAWAI
8 stars 3 forks source link

Core dumped quand on modifie le volume sonore #198

Closed OlivierMarty closed 9 years ago

OlivierMarty commented 9 years ago

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.

VLanvin commented 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).

OlivierMarty commented 9 years ago

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 !

TheoWinterhalter commented 9 years ago

C'est donc moi qui ait introduit ce bug ? C'est vraiment étrange… Surtout que je ne touche pas à Game.ml...

TheoWinterhalter commented 9 years ago

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.

VLanvin commented 9 years ago

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...

VLanvin commented 9 years ago

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.

VLanvin commented 9 years ago

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

VLanvin commented 9 years ago

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.