Les membres ayant 30 points peuvent parler sur les canaux annonces, projets et hs du chat.
La shoutbox n'est pas chargée par défaut pour des raisons de performances. Cliquez pour charger.

Forum Casio - Autres questions


Index du Forum » Autres questions » [gint/debug] Pistes pour debug une erreur système ?
Kikoodx Hors ligne Ancien labélisateur Points: 3039 Défis: 11 Message

[gint/debug] Pistes pour debug une erreur système ?

Posté le 02/05/2021 18:05

Bonjour, on a passé quelques heures avec Toutouille à debug une erreur système et c'est très pénible d'en trouver la source.

Lephénixnoir avait mentionné sur un topic de Pedrobzh un dossier contenant la liste de toutes les fonctions de l'add-in. Je ne trouve pas ce dossier après compilation CMake, comment le faire « apparaître » ? Si j'ai bien compris, cela permettrait de trouver la source du problème avec la valeur de PC.

Autre question, qui est plus curieuse qu'autre chose. Que signifie la valeur de TRA sur l'écran System ERROR ?

Merci pour votre attention.

J'ai créé un projet minimal qui génère un TLB Miss, si ça peut aider à avoir des données qui concordent.
https://gitea.planet-casio.com/KikooDX/tlb-simulator



Lephenixnoir Hors ligne Administrateur Points: 24649 Défis: 170 Message

Citer : Posté le 02/05/2021 18:17 | #


Le fichier en question est la « carte » de l'add-in, il est généré par ld quand tu finis de compiler. L'option était activée par défaut dans la version Makefile des projets, mais pour CMake ce n'est pas le cas. Tu peux l'ajouter comme ceci :

target_link_options(<TARGET> PRIVATE -Wl,-Map=map)

et après avoir recompilé regarde build-fx/map ou build-cg/map.

Il y a différentes sources d'exceptions dans la calculatrices, et l'une d'elles est une instruction nommée trapa. Son unique rôle est de créer une exception histoire que le noyau reprenne la main dans les noyaux où il y a un userland. C'est utilisé pour implémenter des syscalls ; le programme veut appeler un syscall, il exécute un trapa, le noyau voir l'exception qui n'en est pas une, et exécute un syscall. trapa prend un argument, et TRA c'est la valeur de cet argument.

Comme dans la calculatrice on n'utilise pas trapa, cette instruction n'est jamais la cause d'une System ERROR, et donc la valeur affichée à l'écran n'a jamais de sens. Ça peut être utile pour debugger en situations très extrêmes où on veut juste un panic, et dans ce cas on peut mettre un argument différents à différents endroits du code et la valeur de TRA indique par où on est passé.

Pour info, puisque ce topic a un nom assez générique et que je pense que d'autres personnes le liront, les informations les plus importantes sont:

1. Le nom de l'erreur (et le code à trois chiffre devant).
2. La valeur de PC, qui est l'endroit du code où l'erreur s'est produite ; en utilisant la carte de l'add-in ou en désassemblant l'ELF, on peut trouver dans quelle fonction c'est.
3. La valeur de TEA, qui lorsque l'erreur est lié à un accès mémoire (souvent le cas), indique à quelle adresse le code a accédé.

L'erreur la plus classique c'est soit TLB miss read/write soit Read/write address error. Le premier signifie que le code (PC) a accédé à une adresse (TEA) qui n'existe pas du tout. Le second signifie que le code (PC) a accédé à une adresse (TEA) mal alignée. Pour plus de détails sur l'alignement, voyez cette partie du TDM 19.
Mon graphe (11 Avril): ((Rogue Life || HH2) ; PythonExtra ; serial gint ; Boson X ; passe gint 3 ; ...) || (shoutbox v5 ; v5)
Kikoodx Hors ligne Ancien labélisateur Points: 3039 Défis: 11 Message

Citer : Posté le 02/05/2021 18:36 | # | Fichier joint


Merci beaucoup pour les explications ! J'ai essayé sur TLB Sim, et j'ai bien trouvé que l'erreur venait de _main

J'ai maintenant essayé d'appliquer cette méthode sur la branche master d'AST3, qui contient un TLB miss on read facheux qu'on cherche à localiser. J'ai le code PC 003040b4, hors l'adresse la plus proche dans la map (0x00000000003040a8) correspond à _keydev_keydown. J'ai raté quelque chose ? Tituya a des résultats similaires.

Je met la map en pièce jointe. Merci pour ton temps
ouais ouais
Lephenixnoir Hors ligne Administrateur Points: 24649 Défis: 170 Message

Citer : Posté le 02/05/2021 18:45 | #


C'est correct. Ce qui va compter ici (malheureusement) c'est de savoir qui l'a appelée, et ça c'est difficile si on ne peut pas inspecter la pile (stack unwinding), un truc plus élaboré qu'on n'a pas.

Cette fonction est appelée par keydown() et indirectement par getkey(). La variable à laquelle elle accède est bien là (cachée dans le fichier keysc à 0x08101460), et je serais surpris que cette fonction soit buggée à proprement parler.

Là si j'étais vous je m'intéresserais à trouver quel appel à keydown() ou getkey() dans le code provoque cette erreur.
Mon graphe (11 Avril): ((Rogue Life || HH2) ; PythonExtra ; serial gint ; Boson X ; passe gint 3 ; ...) || (shoutbox v5 ; v5)
Tituya Hors ligne Administrateur Points: 2156 Défis: 26 Message

Citer : Posté le 02/05/2021 19:00 | #


Il s'agissait en effet d'une erreur basique....
J'avais keydown_any(KEY_RIGHT, KEY_LEFT) qu'il fallait transformer en keydown_any(KEY_RIGHT, KEY_LEFT, 0)


Bretagne > Reste du globe
(Et de toute façon, vous pouvez pas dire le contraire)
Projet en cours : Adoranda

Mes programmes
Hésite pas à faire un test !


Lephenixnoir Hors ligne Administrateur Points: 24649 Défis: 170 Message

Citer : Posté le 02/05/2021 19:02 | #


Aah, et ainsi keydev_keydown() accédait à un indice du tableau qui n'existait pas car il allait chercher des touches au-delà de la fin de la liste. Je pourrais ajouter une protection mais ça ne ferait que rendre le problème plus difficile à résoudre, donc je pense que je vais laisser le code comme ça.
Mon graphe (11 Avril): ((Rogue Life || HH2) ; PythonExtra ; serial gint ; Boson X ; passe gint 3 ; ...) || (shoutbox v5 ; v5)
Tituya Hors ligne Administrateur Points: 2156 Défis: 26 Message

Citer : Posté le 02/05/2021 19:04 | #


Merci en tout cas
Pas besoin de protection supplémentaire vu que tu l'as bien indiqué dans le header correspondant.
En voulant faire les choses trop vite, j'ai finalement perdu 3 heures
Bretagne > Reste du globe
(Et de toute façon, vous pouvez pas dire le contraire)
Projet en cours : Adoranda

Mes programmes
Hésite pas à faire un test !


Kikoodx Hors ligne Ancien labélisateur Points: 3039 Défis: 11 Message

Citer : Posté le 02/05/2021 19:22 | #


Ahah, c'était donc ça. Bien joué Tituya, l'enfer est fini.

Merci pour tout ces informations Lephé, ce topic sera sûrement utile à d'autres dans le futur
ouais ouais

LienAjouter une imageAjouter une vidéoAjouter un lien vers un profilAjouter du codeCiterAjouter un spoiler(texte affichable/masquable par un clic)Ajouter une barre de progressionItaliqueGrasSoulignéAfficher du texte barréCentréJustifiéPlus petitPlus grandPlus de smileys !
Cliquez pour épingler Cliquez pour détacher Cliquez pour fermer
Alignement de l'image: Redimensionnement de l'image (en pixel):
Afficher la liste des membres
:bow: :cool: :good: :love: ^^
:omg: :fusil: :aie: :argh: :mdr:
:boulet2: :thx: :champ: :whistle: :bounce:
valider
 :)  ;)  :D  :p
 :lol:  8)  :(  :@
 0_0  :oops:  :grr:  :E
 :O  :sry:  :mmm:  :waza:
 :'(  :here:  ^^  >:)

Σ π θ ± α β γ δ Δ σ λ
Veuillez donner la réponse en chiffre
Vous devez activer le Javascript dans votre navigateur pour pouvoir valider ce formulaire.

Si vous n'avez pas volontairement désactivé cette fonctionnalité de votre navigateur, il s'agit probablement d'un bug : contactez l'équipe de Planète Casio.

Planète Casio v4.3 © créé par Neuronix et Muelsaco 2004 - 2024 | Il y a 108 connectés | Nous contacter | Qui sommes-nous ? | Licences et remerciements

Planète Casio est un site communautaire non affilié à Casio. Toute reproduction de Planète Casio, même partielle, est interdite.
Les programmes et autres publications présentes sur Planète Casio restent la propriété de leurs auteurs et peuvent être soumis à des licences ou copyrights.
CASIO est une marque déposée par CASIO Computer Co., Ltd