IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

GDB Discussion :

GDB ne catche / s'arrête pas sur les SIGFPE


Sujet :

GDB

  1. #1
    Nouveau membre du Club
    Inscrit en
    Octobre 2008
    Messages
    48
    Détails du profil
    Informations forums :
    Inscription : Octobre 2008
    Messages : 48
    Points : 34
    Points
    34
    Par défaut GDB ne catche / s'arrête pas sur les SIGFPE
    Bonjour,

    J'utilise gcc (11.2.0-mingw-w64ucrt-9.0.0-r5), et j'essaie de debugger avec gdb un code Fortran avec CodeBlocks sous Windows 10.

    GDB ne semble pas catcher / s'arrêter sur les SIGFPEs. Je n'ai pas souvenir d'un comportement similaire sur des installs plus anciennes (mais j'ai changé de boulot y a quelques mois et je ne peux plus checker).

    Voici les options de compil que j'utilise pour le debug (je les liste toutes pour être exhaustif mais la plupart ne devraient rien avoir à voir...)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    -g -fcheck=all -fcheck=bounds -fbacktrace -Og -fno-automatic -fdefault-real-8 -fdefault-double-8 -fno-align-commons -Wline-truncation -Wsurprising -ffpe-trap=invalid,zero,overflow -march=native -fmax-errors=3
    Voici ce que dit la console de CodeBlockslors de l'appel GDB (pour voir les arguments passés) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Starting debugger: D:\Logiciels\GCC\bin\gdb.exe -nx -fullname -quiet  -args D:/Work/Baro/bin/Debug/BARO.exe
    done
    Voici maintenant le reste de la sortie console (je passe les infos sur la version etc.)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    [debug]>>>>>>cb_gdb:
    [debug]> set confirm off
     
    Debugger name and version: GNU gdb (GDB for MinGW-W64 x86_64, built by Brecht Sanders) 11.2
     
    [debug]>>>>>>cb_gdb:
    [debug]> set width 0
    [debug]>>>>>>cb_gdb:
    [debug]> set height 0
    [debug]>>>>>>cb_gdb:
    [debug]> set breakpoint pending on
    [debug]>>>>>>cb_gdb:
    [debug]> set print asm-demangle on
    [debug]>>>>>>cb_gdb:
    [debug]> set unwindonsignal on
    [debug]>>>>>>cb_gdb:
    [debug]> set print elements 200
    [debug]>>>>>>cb_gdb:
    [debug]> set new-console on
    [debug]>>>>>>cb_gdb:
    [debug]> set disassembly-flavor att
    [debug]>>>>>>cb_gdb:
    [debug]> catch throw
    [debug]Catchpoint 1 (throw)
    [debug]>>>>>>cb_gdb:
    [debug]> directory D:/Work/Baro/
    [debug]Source directories searched: D:/Work/Baro;$cdir;$cwd
    [debug]>>>>>>cb_gdb:
    [debug]> py print(1+2)
    [debug]3
    [debug]>>>>>>cb_gdb:
    [debug]> set $fortran_script_dir = 'D:\Logiciels\CodeBlocks\share\codeblocks/images/fortranproject/'
    [debug]>>>>>>cb_gdb:
    [debug]> source D:\Logiciels\CodeBlocks\share\codeblocks/images/fortranproject/gdb_fortran_extensions_v1.0.py
    [debug]>>>>>>cb_gdb:
    [debug]> run
    [debug]Starting program: D:\Work\Baro\bin\Debug\BARO.exe 
     
    Child process PID: 21196
     
    [debug][New Thread 21196.0x1408]
    [debug][New Thread 21196.0x11f4]
    [debug][New Thread 21196.0x51c4]
    [debug][Thread 21196.0x51c4 exited with code 2]
    [debug][Thread 21196.0x11f4 exited with code 2]
    [debug][Thread 21196.0x1408 exited with code 2]
    [debug][Inferior 1 (process 21196) exited with code 02]
    [debug]>>>>>>cb_gdb:
     
    [Inferior 1 (process 21196) exited with code 02]
     
    [debug]> quit
     
    Debugger finished with status 0
    Je vois du "exit with code 02", qui d'après Google semble bien pouvoir correspondre à un souci type SIGFPE ?
    Mais derrière GDB / l'IDE n'ont jamais suspendu l'exécution en me mettant le curseur là où il y a un pb (comme je l'attendrais), il ne fait que terminer le truc et du coup ça me sert à rien.
    Est-ce que je loupe quelque chose ? Y a-t-il par ailleurs des arguments particuliers à passer à gdb par exemple (mais j'ai vraiment pas souvenir de ça...) ? Autre chose ?

    Edit : j'ai ssayé d'ajouter la commande "info signal SIGFPE" lors du lancement de gdb, voici le résultat : normal ou pas ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    [debug]> info signal SIGFPE
    [debug]Signal        Stop	Print	Pass to program	Description
    [debug]SIGFPE        Yes	Yes	Yes		Arithmetic exception
    J'ai aussi essayé tour à tour d'ajouter `handle SIGFPE stop nopass`, `handle SIGFPE nostop nopass`, et `handle SIGFPE nostop pass` (avant et après connexion à la cible).

    gdb renvoie alors un statut en accord sur la console, mais ça change rien sur le comportement concret lors du debug...

    Merci de votre aide.

  2. #2
    Nouveau membre du Club
    Inscrit en
    Octobre 2008
    Messages
    48
    Détails du profil
    Informations forums :
    Inscription : Octobre 2008
    Messages : 48
    Points : 34
    Points
    34
    Par défaut
    Ok, je me réponds à moi-même... y avait plusieurs choses.

    1) Exit code 02 en fait c'est pas du SIGFPE (même si j'avais aussi des soucis similaires avec les SIGFPE). Il semblerait que les SIGFPE ce soit exit code 03. Dans mon cas, l'exit code 02 était dû à une out-of-bound error.

    2) Ajouter "handle SIGFPE stop nopass" aux commandes gdb additionnelles a amélioré les choses dans le cas des SIGFPE. L'IDE s'arrête bien maintenant à chaque fois dessus (mais ça aurait déjà dû être le cas avant ?)

    3) Pour les out of bounds, l'option de compil "-fcheck=all -fcheck=bounds" menait logiquement à une terminaison (comme elle devait).

    Néanmoins j'ai essayé sans pour voir ce que ça changerait (et si gdb attraperait maintenant le truc, au lieu qu'il soit "auto-terminé" par le programme lui-même à cause de ça ?), mais ça n'a rien changé (le programme se termine quand même, et gdb n'intervenait pas plus - à se demander à quoi servent ces flags ?).

    La solution a été d'ajouter "break exit" aux commandes gdb additionnelles. Dans ce cas, gdb interrompt bien l'exécution et pointe bien vers la ligne responsable.

    Bref, problème résolu. Mais c'est bizarre, car je suis persuadé de jamais avoir eu besoin de faire ça auparavant (il est vrai que c'était avec une version de gcc un peu plus ancienne, style 8 ou 10, mais bon...)

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. ne s'arrête pas sur les points d'arrêt du site web
    Par cortex024 dans le forum Développement Web avec .NET
    Réponses: 5
    Dernier message: 09/09/2011, 16h40
  2. [T-SQL Debugger] Ne s'arrête pas sur les points d'arrêt
    Par vincenteraptor dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 28/01/2008, 17h51
  3. Réponses: 4
    Dernier message: 03/04/2006, 08h50
  4. CSS : Bordure sur les liens mais pas sur les images ?
    Par monstroplante dans le forum Mise en page CSS
    Réponses: 1
    Dernier message: 04/02/2006, 14h18
  5. [CSS] border-collapse sur les TR mais pas sur les TD.
    Par hpfx dans le forum Mise en page CSS
    Réponses: 6
    Dernier message: 03/04/2005, 16h16

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo