Les membres ayant 30 points peuvent parler sur les canaux annonces, projets et hs du chat.

Forum Casio - Projets de programmation


Index du Forum » Projets de programmation » fx-CG50 Manager PLUS - gdbserver : débuggez vos add-ins et CASIOWIN
Redoste Hors ligne Membre Points: 42 Défis: 0 Message

fx-CG50 Manager PLUS - gdbserver : débuggez vos add-ins et CASIOWIN

Posté le 05/12/2020 23:57

En voulant effectuer de la rétro-ingénierie sur l'OS de ma GRAPH90+ E ( ne me demandez pas pourquoi, même moi je ne sais pas ), je me suis retrouvé plusieurs fois à patcher l'OS et à le reflasher sur ma calculatrice pour valider des théories sur le fonctionnement de celui-ci. Ce processus est plutôt dangereux pour des tas de raisons ( coupure de courant durant le flash, usure excessive de la flash, modifier un bout de code qu'il ne fallait pas qui mène à la corruption du bootloader, etc. ) or comme je ne me vois pas avec un fer à souder pour réparer tout ça, je me suis lancé dans le développement de cet outil.

Il s’agit d'une DLL qui remplace CPU73050.dll de fx-CG50 Manager PLUS et qui implémente les fonctions de base du GDB remote serial protocol. Il devient alors possible d'utiliser GDB pour débugger CASIOWIN mais aussi des add-ins sans abimer utiliser de matériel.

Comme indiqué sur le repo GitHub, il manque encore beaucoup de fonctionnalités importantes ( comme écrire en mémoire et donc placer des breakpoints à l’exécution ) mais la base est là et je poste donc ici pour voir si des gens sont intéressés ( ou si quelque chose de similaire existe déjà et donc que je viens de passer 2 semaines sur un projet inutile ).

Pour ceux intéressés mais qui ne veulent pas mettre en place tout l’environnement nécessaire, j'ai mis une très simple vidéo de démo sur Youtube qui montre ce qui fonctionne à ce jour ( lecture de la mémoire, lecture et écriture des registres ainsi que l'arrêt sur des breakpoints intégrés dans l'add-in à l'avance ).




Slyvtt Hors ligne Community Manager Points: 834 Défis: 0 Message

Citer : Posté le 28/08/2022 17:07 | #


Donc, si je cherche à comprendre un peu plus profondément, pour créer ces fameuses cibles "debug"

Il faudrait que je fasse :
1/ dans fxsdk.sh ( ~/.local/share/giteapc/Lephenixnoir/fxsdk/fxsdk ) :
je dois commencer par créer une cible supplémentaire : par exemple transformer les lignes 130 à 150 pour la partie fxsdk_build()
fxsdk_build() {
  [[ ! -e build-fx && ! -e build-cg && ! -e build-cg-dbg ]]
  none_exists=$?

  if [[ -e build-fx || $none_exists == 0 ]]; then
    echo "$TAG Making into build-fx"
    fxsdk_build_fx "$@"
  fi

  if [[ -e build-cg || $none_exists == 0 ]]; then
    echo "$TAG Making into build-cg"
    fxsdk_build_cg "$@"
  fi

  if [[ -e build-cg-dbg || $none_exists == 0 ]]; then
    echo "$TAG Making into build-cg With Debug Information"
    fxsdk_build_cg_debug "$@"
  fi
}

fxsdk_build_fx() {
  fxsdk_build_in "fx" "FX9860G" "$@"
}
fxsdk_build_cg() {
  fxsdk_build_in "cg" "FXCG50" "$@"
}
fxsdk_build_cg_debug() {
  fxsdk_build_in "cgdbg" "FXCG50DEBUG" "$@"
}



2/ dans le depot gint je dois mettre la jour les cibles de manière parallèles:
je dois ajouter dans CMakeLists.txt au niveau de la ligne 257 (juste après la cible fxCG50) une nouvelle cible

if("${FXSDK_PLATFORM_LONG}" STREQUAL fxCG50DEBUG)
  add_compile_definitions(FXCG50)
  
# je pense qu'il faut que je mette mon -g ici en supplément pour avoir les infos de debug qui se génèrent
  add_compile_options(-g)

  add_library(gint-cg-debug STATIC ${SOURCES_COMMON} ${SOURCES_CG} ${ASSETS_CG})
  set(NAME "gint-cg-debug")
  set(LINKER_SCRIPT "fxcg50debug.ld")
endif()


avec bien entendu le script fxcg50debug.ld où je retire du DISCARD toute la partie d'info de debug

du coup le je pense avoir un gint-cg-debug.a qui me servira pour la génération de ma cible de projet

et 3/ dans un projet que je veux debugger, je rajoute la cible DEBUG dans le CMakeLists.txt :
fxconv_declare_assets(${ASSETS} ${ASSETS_fx} ${ASSETS_cg} WITH_METADATA)

add_executable(myaddin ${SOURCES} ${ASSETS} ${ASSETS_${FXSDK_PLATFORM}})
target_compile_options(myaddin PRIVATE -Wall -Wextra -Os)
target_link_libraries(myaddin Gint::Gint)

if("${FXSDK_PLATFORM_LONG}" STREQUAL fx9860G)
  generate_g1a(TARGET myaddin OUTPUT "MyAddin.g1a"
    NAME "MyAddin" ICON assets-fx/icon.png)
elseif("${FXSDK_PLATFORM_LONG}" STREQUAL fxCG50)
  generate_g3a(TARGET myaddin OUTPUT "MyAddin.g3a"
    NAME "MyAddin" ICONS assets-cg/icon-uns.png assets-cg/icon-sel.png)
elseif("${FXSDK_PLATFORM_LONG}" STREQUAL fxCG50DEBUG)
  generate_g3a(TARGET myaddin OUTPUT "MyAdDBG.g3a"
    NAME "MyAddin" ICONS assets-cg/icon-uns.png assets-cg/icon-sel.png)
endif()


C'est ça ou j'ai rien pané à comment fonctionne cmake et tous les depots du fxsdk/gint entre eux ?
Lephenixnoir Hors ligne Administrateur Points: 22599 Défis: 149 Message

Citer : Posté le 28/08/2022 17:56 | #


C'est... une option, mais clairement pas la meilleure.

CMake a déjà un système intégré pour les build de debug, avec tout un concept de "configurations" où tu peux instancier le même système de compilation avec différents paramètres (le mode debug étant le plus canonique de tous).

Donc ici, la commande fxsdk build-cg-debug est raisonnable, mais y'a pas besoin de dupliquer la toolchain :

fxsdk_build_cg_debug() {
  fxsdk_build_in "cg-debug" "FXCG50" "$@"
    # Ajouter un paramètre pour passer  "-DCMAKE_BUILD_TYPE=Debug" à cmake
}

CMake ajoutera -g tout seul du fait de CMAKE_BUILD_TYPE=Debug. Ensuite t'as juste envie d'aller dans gint pour changer le linker script de :

  set(INTF_LINK "-T;fxcg50.ld")

à un truc comme

  set(INTF_LINK "-T;$<IF:$<CONFIG:Debug>,fxcg50-debug.ld,fxcg50.ld>")

sachant que du coup faudrait compiler gint en mode debug aussi (mais ça on peut le faire pour tout le monde tout le temps y'a pas besoin de paramètre) et tu peux choisir le nom de ton g3a en testant la config.

Reste que le linker script est dupliqué, ce qui est pas trop. Faudrait sans doute générer les deux à partir d'un seul fichier source de gint, au moment de l'installation.
Slyvtt Hors ligne Community Manager Points: 834 Défis: 0 Message

Citer : Posté le 28/08/2022 20:02 | #


Je comprend l'idée, mais ne vois pas comment tu ajoutes le paramètre de ta ligne
# Ajouter un paramètre pour passer "-DCMAKE_BUILD_TYPE=Debug" à cmake

tu lui mets un set( CONFIG "Debug" ) ?
qui sera repris dans la ligne set(INTF_LINK "-T;$<IF:$<CONFIG:Debug>,fxcg50-debug.ld,fxcg50.ld>") ?
Lephenixnoir Hors ligne Administrateur Points: 22599 Défis: 149 Message

Citer : Posté le 28/08/2022 21:14 | #


Il faut ajouter un paramètre à fxsdk_build_in pour que quand elle appelle cmake elle ajoute, sur demande, -DCMAKE_BUILD_TYPE=Debug.

Cela aura pour conséquence que le test $<CONFIG:Debug> sera vrai. C'est tout des variables internes de CMake, c'est connecté à CMAKE_BUILD_TYPE.
Redoste Hors ligne Membre Points: 42 Défis: 0 Message

Citer : Posté le 29/08/2022 19:58 | #


Slyvtt a écrit :

Deuxième point, je ne sais pas si Bernard a aussi expérimenté cette déconvenue, le "make" sort sur une erreur dans le fichier 'sh3eb-gdb/sim/sh/targ-map.c' pour le signal "SIGSTKSZ" (ligne 433 du dit fichier). Malheureusement je n'ai pas trouvé de meilleure méthode pour contourner l'erreur que de commenter ce bloc.

Je suis surpris que tu rencontres autant de difficultés à compiler GDB, je suppose que le code provient d'une archive d'une release stable, il ne devrait pas y avoir d'erreurs de compilation même sur les architectures les plus obscures car celles-ci sont compilées régulièrement par les distros.

En effet ce que j'ai l'habitude de faire et que je recommande pour plus de simplicité c'est d'utiliser un gdb-multiarch. Il s'agit d'une config de GDB qui contient toutes les architectures et elle est disponible sur beaucoup de distro "mainstream" : e.g. Ubuntu Debian Arch (AUR). Si jamais elle n'est pas disponible, il est plutôt simple de la compiler soi-même en suivant le PKGBUILD de l'AUR.
Comme ça, plus besoin de trop réfléchir, on a un GDB qui fonctionne pour toutes les archis de binutils.

Pour l'utiliser en revanche il faut penser à bien régler l'architecture et l'endianness de la machine. Si on charge un ELF qui comporte ces informations il ne devrait pas y avoir de problèmes mais j'ai pris l'habitude de toujours la régler car il m'arrive souvent de l'utiliser sans fichier attaché :
$ gdb-multiarch -q --nx
(gdb) set architecture sh4a-nofpu
The target architecture is set to "sh4a-nofpu".
(gdb) set endian big
The target is set to big endian.
(gdb) file file.elf
Reading symbols from file.elf...
(gdb) target remote localhost:31188
Remote debugging using localhost:31188

Pour rendre la chose plus automatisée on peut écrire ces commandes dans un fichier et utiliser l'option -x pour interpréter son contenu au démarrage.
Lephenixnoir Hors ligne Administrateur Points: 22599 Défis: 149 Message

Citer : Posté le 30/08/2022 14:50 | #


Merci pour les détails Redoste, très utile comme d'habitude. J'ai toujours dans un coin de la tête le debugging direct par USB avec Yatis...
Parisse Hors ligne Membre Points: 374 Défis: 0 Message

Citer : Posté le 30/08/2022 22:57 | #


@Slyvtt : je n'ai pas eu le probleme que tu signales pour compiler le cross debugger gdb (j'ai du le refaire il y a quelques jours sur une debian 11)
Ensuite je n'ai pas deux versions pour l'addin, mais une seule. C'est le elf qui sert a debugguer, l'addin est de toute facons "strippe" de toutes les infos de debug. Mon mode d'emploi est ici https://www-fourier.univ-grenoble-alpes.fr/~parisse/casio/khicasio.html#sec46 et s'adapte pour l'addin en 2 parties (cf le Makefile de l'archive de https://www-fourier.univ-grenoble-alpes.fr/~parisse/casio/giacbfalpha.tgz)
Ceci etant dit, l'utilisation du cross debugger avec l'emulateur de Casio reste assez instable par rapport à celui que j'utilise pour les ti nspire cx avec firebird-emu, mais ca permet parfois de debloquer.

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 v42 © créé par Neuronix et Muelsaco 2004 - 2022 | Il y a 72 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