Tutoriel Corrigez vous-même les erreurs de votre serveur grâce aux stack traces !

Vicreaft

ok.
26 Juin 2012
242
39
136
Bonjour et bienvenue dans ce guide qui va vous apprendre à déterminer comment votre serveur à crash.

Avant toute chose, il faut savoir qu’en regardant sur internet des exemples de stack trace pour mon tutoriel, je suis tombé sur ce guide. Vu qu’il était relativement bien fait, j’ai donc décidé de le traduire pour la communauté française, et j’y ai ajouté certaines petites choses pour le compléter.

C’est parti !

« C’est quoi un « stack trace » ? »
Les stack traces sont essentiellement des longs messages d’erreur qui s’affichent dans la console de la part d’un plugin (ou un programme) pour informer l’utilisateur ou le développeur de ce qui s’est mal passé. Le stack trace contient deux parties : l’erreur qui a été rencontrée et où dans le code elle à été commise. Cette information peut t’aider, toi l’administrateur du serveur, et surtout toi, le développeur, à déterminer ce qui s’est mal passé.

Les stack traces d’un plugin

Voici ici un exemple de stack trace d’un plugin :
Code:
[11:56:54] [Server thread/WARN]: java.lang.NullPointerException
[11:56:54] [Server thread/WARN]:    at net.paradoxmc.NetworkManager.Points.PointsAPI.getPoints(PointsAPI.java:28)
[11:56:54] [Server thread/WARN]:    at net.paradoxmc.NetworkManager.GizmoManager.ScoreboardManager$1.run(ScoreboardManager.java:40)
[11:56:54] [Server thread/WARN]:    at org.bukkit.craftbukkit.v1_7_R4.scheduler.CraftTask.run(CraftTask.java:71)
[11:56:54] [Server thread/WARN]:    at org.bukkit.craftbukkit.v1_7_R4.scheduler.CraftScheduler.mainThreadHeartbeat(CraftScheduler.java:350)
[11:56:54] [Server thread/WARN]:    at net.minecraft.server.v1_7_R4.MinecraftServer.v(MinecraftServer.java:641)
[11:56:54] [Server thread/WARN]:    at net.minecraft.server.v1_7_R4.DedicatedServer.v(DedicatedServer.java:289)
[11:56:54] [Server thread/WARN]:    at net.minecraft.server.v1_7_R4.MinecraftServer.u(MinecraftServer.java:584)
[11:56:54] [Server thread/WARN]:    at net.minecraft.server.v1_7_R4.MinecraftServer.run(MinecraftServer.java:490)
[11:56:54] [Server thread/WARN]:    at net.minecraft.server.v1_7_R4.ThreadServerApplication.run(SourceFile:628)
Quand on regarde la portion du haut :
Code:
[11:56:54] [Server thread/WARN]: java.lang.NullPointerException
[11:56:54] [Server thread/WARN]:    at net.paradoxmc.NetworkManager.Points.PointsAPI.getPoints(PointsAPI.java:28)
[11:56:54] [Server thread/WARN]:    at net.paradoxmc.NetworkManager.GizmoManager.ScoreboardManager$1.run(ScoreboardManager.java:40)
Pour cette erreur, on voit que l’erreur est à la ligne 28 de PointsAPI.java, dans une fonction appelée getPoints(). Dans ce cas, c’était car le système de points du plugin ne pouvait pas se connecter à la database. Cette fonction a été appelée par ScoreboardManager$1.run() (une classe anonyme (car elle n’a pas de nom spécifique à elle) dans la classe ScoreboardManager), ce qui aurait provoqué l’actualisation du scoreboard.

Comment savoir quelle a été l’erreur ? Là, je suis désolé mais il va falloir comprendre un tout petit peu l’anglais, c’est dans le nom de l’erreur. Le nom de l’erreur est à la première ligne, c’est « NullPointerException ». Dans un français correct, cela veut dire « L’emplacement de ton information n’existe pas, son nom ne renvoie vers rien. » Vous pouvez trouver un liste de la plupart des Exceptions (c’est comme ça que l’on appelle ces erreurs) ici.

La seconde partie de votre stack trace provient du programme qui fait tourner votre serveur (crafbukkit.jar, minecraftserver.jar, etc…)
Code:
[11:56:54] [Server thread/WARN]:    at org.bukkit.craftbukkit.v1_7_R4.scheduler.CraftTask.run(CraftTask.java:71)
[11:56:54] [Server thread/WARN]:    at org.bukkit.craftbukkit.v1_7_R4.scheduler.CraftScheduler.mainThreadHeartbeat(CraftScheduler.java:350)
[11:56:54] [Server thread/WARN]:    at net.minecraft.server.v1_7_R4.MinecraftServer.v(MinecraftServer.java:641)
[11:56:54] [Server thread/WARN]:    at net.minecraft.server.v1_7_R4.DedicatedServer.v(DedicatedServer.java:289)
[11:56:54] [Server thread/WARN]:    at net.minecraft.server.v1_7_R4.MinecraftServer.u(MinecraftServer.java:584)
[11:56:54] [Server thread/WARN]:    at net.minecraft.server.v1_7_R4.MinecraftServer.run(MinecraftServer.java:490)
[11:56:54] [Server thread/WARN]:    at net.minecraft.server.v1_7_R4.ThreadServerApplication.run(SourceFile:628)

Les stack traces provenant d’erreurs YAML
Les gens sont parfois confus faces à ces stack traces, ils pensent que l’erreur vient du plugin. C’est tout à fait faux. C’est un problème que vous avez causé qui peut être très facilement résolu. Voici un exemple d’un stack trace provenant du plugin PermissionsEx, causé par une syntaxe incorrecte quand vous avez voulu changé un préfixe (ex : vous avez voulu changer le [ADMIN] qui s’affichait dans le chat devant votre pseudo en [ADMINSUPERCOOL])

Code:
ru.tehkode.permissions.exceptions.PermissionBackendException: Error loading permissions file!
    at ru.tehkode.permissions.backends.file.FileBackend.reload(FileBackend.java:331) ~[PermissionsEx.jar:?]
    at ru.tehkode.permissions.backends.file.FileBackend.<init>(FileBackend.java:119) ~[PermissionsEx.jar:?]
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) ~[?:1.7.0_55]
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:57) ~[?:1.7.0_55]
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) ~[?:1.7.0_55]
    at java.lang.reflect.Constructor.newInstance(Constructor.java:526) ~[?:1.7.0_55]
    at ru.tehkode.permissions.backends.PermissionBackend.getBackend(PermissionBackend.java:372) ~[PermissionsEx.jar:?]
    at ru.tehkode.permissions.backends.PermissionBackend.getBackend(PermissionBackend.java:347) ~[PermissionsEx.jar:?]
    at ru.tehkode.permissions.PermissionManager.createBackend(PermissionManager.java:713) ~[PermissionsEx.jar:?]
    at ru.tehkode.permissions.PermissionManager.setBackend(PermissionManager.java:695) ~[PermissionsEx.jar:?]
    at ru.tehkode.permissions.PermissionManager.initBackend(PermissionManager.java:772) ~[PermissionsEx.jar:?]
    at ru.tehkode.permissions.PermissionManager.<init>(PermissionManager.java:74) ~[PermissionsEx.jar:?]
    at ru.tehkode.permissions.bukkit.PermissionsEx.onEnable(PermissionsEx.java:158) [PermissionsEx.jar:?]
    at org.bukkit.plugin.java.JavaPlugin.setEnabled(JavaPlugin.java:316) [spigot.jar:git-Spigot-1604]
    at org.bukkit.plugin.java.JavaPluginLoader.enablePlugin(JavaPluginLoader.java:329) [spigot.jar:git-Spigot-1604]
    at org.bukkit.plugin.SimplePluginManager.enablePlugin(SimplePluginManager.java:405) [spigot.jar:git-Spigot-1604]
    at org.bukkit.craftbukkit.v1_7_R4.CraftServer.loadPlugin(CraftServer.java:476) [spigot.jar:git-Spigot-1604]
    at org.bukkit.craftbukkit.v1_7_R4.CraftServer.enablePlugins(CraftServer.java:394) [spigot.jar:git-Spigot-1604]
    at org.bukkit.craftbukkit.v1_7_R4.CraftServer.reload(CraftServer.java:866) [spigot.jar:git-Spigot-1604]
    at org.bukkit.Bukkit.reload(Bukkit.java:301) [spigot.jar:git-Spigot-1604]
    at org.bukkit.command.defaults.ReloadCommand.execute(ReloadCommand.java:23) [spigot.jar:git-Spigot-1604]
    at org.bukkit.command.SimpleCommandMap.dispatch(SimpleCommandMap.java:181) [spigot.jar:git-Spigot-1604]
    at org.bukkit.craftbukkit.v1_7_R4.CraftServer.dispatchCommand(CraftServer.java:767) [spigot.jar:git-Spigot-1604]
    at org.bukkit.craftbukkit.v1_7_R4.CraftServer.dispatchServerCommand(CraftServer.java:753) [spigot.jar:git-Spigot-1604]
    at net.minecraft.server.v1_7_R4.DedicatedServer.aB(DedicatedServer.java:326) [spigot.jar:git-Spigot-1604]
    at net.minecraft.server.v1_7_R4.DedicatedServer.v(DedicatedServer.java:290) [spigot.jar:git-Spigot-1604]
    at net.minecraft.server.v1_7_R4.MinecraftServer.u(MinecraftServer.java:584) [spigot.jar:git-Spigot-1604]
    at net.minecraft.server.v1_7_R4.MinecraftServer.run(MinecraftServer.java:490) [spigot.jar:git-Spigot-1604]
    at net.minecraft.server.v1_7_R4.ThreadServerApplication.run(SourceFile:628) [spigot.jar:git-Spigot-1604]
Caused by: org.bukkit.configuration.InvalidConfigurationException: while parsing a block mapping
in 'string', line 10, column 7:
          suffix: '&f'
          ^
expected <block end>, but found Scalar
in 'string', line 12, column 17:
          default: 'false'
                    ^

    at org.bukkit.configuration.file.YamlConfiguration.loadFromString(YamlConfiguration.java:57) ~[spigot.jar:git-Spigot-1604]
    at ru.tehkode.permissions.backends.file.FileConfig.loadFromString(FileConfig.java:62) ~[PermissionsEx.jar:?]
    at org.bukkit.configuration.file.FileConfiguration.load(FileConfiguration.java:226) ~[spigot.jar:git-Spigot-1604]
    at org.bukkit.configuration.file.FileConfiguration.load(FileConfiguration.java:169) ~[spigot.jar:git-Spigot-1604]
    at ru.tehkode.permissions.backends.file.FileConfig.load(FileConfig.java:32) ~[PermissionsEx.jar:?]
    at ru.tehkode.permissions.backends.file.FileBackend.reload(FileBackend.java:319) ~[PermissionsEx.jar:?]
    ... 28 more
Caused by: org.yaml.snakeyaml.parser.ParserException: while parsing a block mapping; expected <block end>, but found Scalar;  in 'string', line 12, column 17:
          default: 'false'
                    ^
    at org.yaml.snakeyaml.parser.ParserImpl$ParseBlockMappingKey.produce(ParserImpl.java:570) ~[spigot.jar:git-Spigot-1604]
    at org.yaml.snakeyaml.parser.ParserImpl.peekEvent(ParserImpl.java:158) ~[spigot.jar:git-Spigot-1604]
    at org.yaml.snakeyaml.parser.ParserImpl.checkEvent(ParserImpl.java:143) ~[spigot.jar:git-Spigot-1604]
    at org.yaml.snakeyaml.composer.Composer.composeMappingNode(Composer.java:230) ~[spigot.jar:git-Spigot-1604]
    at org.yaml.snakeyaml.composer.Composer.composeNode(Composer.java:159) ~[spigot.jar:git-Spigot-1604]
    at org.yaml.snakeyaml.composer.Composer.composeMappingNode(Composer.java:237) ~[spigot.jar:git-Spigot-1604]
    at org.yaml.snakeyaml.composer.Composer.composeNode(Composer.java:159) ~[spigot.jar:git-Spigot-1604]
    at org.yaml.snakeyaml.composer.Composer.composeMappingNode(Composer.java:237) ~[spigot.jar:git-Spigot-1604]
    at org.yaml.snakeyaml.composer.Composer.composeNode(Composer.java:159) ~[spigot.jar:git-Spigot-1604]
    at org.yaml.snakeyaml.composer.Composer.composeMappingNode(Composer.java:237) ~[spigot.jar:git-Spigot-1604]
    at org.yaml.snakeyaml.composer.Composer.composeNode(Composer.java:159) ~[spigot.jar:git-Spigot-1604]
    at org.yaml.snakeyaml.composer.Composer.composeDocument(Composer.java:122) ~[spigot.jar:git-Spigot-1604]
    at org.yaml.snakeyaml.composer.Composer.getSingleNode(Composer.java:105) ~[spigot.jar:git-Spigot-1604]
    at org.yaml.snakeyaml.constructor.BaseConstructor.getSingleData(BaseConstructor.java:120) ~[spigot.jar:git-Spigot-1604]
    at org.yaml.snakeyaml.Yaml.loadFromReader(Yaml.java:481) ~[spigot.jar:git-Spigot-1604]
    at org.yaml.snakeyaml.Yaml.load(Yaml.java:400) ~[spigot.jar:git-Spigot-1604]
    at org.bukkit.configuration.file.YamlConfiguration.loadFromString(YamlConfiguration.java:55) ~[spigot.jar:git-Spigot-1604]
    at ru.tehkode.permissions.backends.file.FileConfig.loadFromString(FileConfig.java:62) ~[PermissionsEx.jar:?]
    at org.bukkit.configuration.file.FileConfiguration.load(FileConfiguration.java:226) ~[spigot.jar:git-Spigot-1604]
    at org.bukkit.configuration.file.FileConfiguration.load(FileConfiguration.java:169) ~[spigot.jar:git-Spigot-1604]
    at ru.tehkode.permissions.backends.file.FileConfig.load(FileConfig.java:32) ~[PermissionsEx.jar:?]
    at ru.tehkode.permissions.backends.file.FileBackend.reload(FileBackend.java:319) ~[PermissionsEx.jar:?]
    ... 28 more
Le stack trace vous informe qu’il y a eu une erreur quand le plugin a voulu charger la configuration. Nous allons maintenant utiliser un outil, qui se situe ici (http://yaml-online-parser.appspot.com/) pour identifier l’erreur.
Voici la portion de la configuration suspecte :
Code:
Helper:
    build: false
    inheritance:
    - Member
    - Donor
    permissions:
    - networkmanager.nohide
    options:
      suffix: '&f'
      prefix: '&8[&9HELPER&8]
      default: 'false'
Quand nous copions-collons cette portion suspecte dans le site, voici ce que nous obtenons :
40c7c0d99f9a8bfdca22814e10eda0503f955f96


EDIT : Pour ceux qui ne la verraient pas, l'mage est ici : https://proxy.spigotmc.org/40c7c0d99f9a8bfdca22814e10eda0503f955f96?url=http://puu.sh/aQAbs/37c5dec728.png

A partir de là vous allez être capable d’identifier l’erreur et de la corriger. Des fois l’erreur apparaitra sur une autre ligne ; dans ce cas, regardez autour.

Vous voici arrivés à la fin de ce tutoriel, vous êtes maintenant capables de lire des stack trace, d’impressionner votre mamie avec vos connaissances et de corriger vous-mêmes vos erreurs sans devoir aller faire un sujet dans la section support serveur de minecraft.fr et ainsi permettre à Detobel36 de se reposer un peu \(^_^)/

Si vous avez tout lu, merci, mon travail n’aura pas été vain ^^

EDIT : Même si vous avez pas TOUT lu, ça me fais plaisir ^^

EDIT 2 : J'ai changé le titre, pour le rendre plus attirant, et plus compréhensible ^^


N’hésitez pas à poster vos questions en commentaires (s’il y en a). Je suis aussi ouvert à toutes propositions de remodelage de mon tutoriel, si vous trouvez que c’est mal organisé >_<
 
Dernière édition:

Vicreaft

ok.
26 Juin 2012
242
39
136
Peut être le copier et l'épingler en section support ? Mais je ne vois pas où demander ça, je demande à un modo directement ou ya une procédure officielle/officieuse ? ^^
 
  • J'aime
Reactions: Diagamma

Exodars

Développeur Java
11 Octobre 2015
124
21
65
Paris
Se tutoriel va être très utile à la communauté et en plus il est très bien expliqué.
Bravo
 

Vicreaft

ok.
26 Juin 2012
242
39
136
J'ai vu ça, mais quand j'édite le message et que je vais dans la prévisualisation, je la vois ><

EDIT : fixed
 

SurvivalZ

Projet SurvivalZ - Serveur DayZ Minecraft !
12 Octobre 2015
136
12
70
24
France
survivalz.fr
Tutoriel très utile ! J'ai enfin pu comprendre à peu près le fonctionnement des messages d'erreurs de la console, merci ! :)
 

Detobel36

Créateur de plugins (PhoenixRebirth)
Support
17 Août 2012
10 530
24
2 247
347
27
Bruxelles - Belgique
www.phoenix-rebirth.fr
Salut,

Je n'avais pas répondu à ce message n'ayant rien d'intéressant à dire (à part Merci (ce qui est tout de même important :p )).

Je fait donc ce message simplement pour demander si il était possible de mettre ce site très pratique plus en évidence. Nous parlons donc de cette phrase:
Nous allons maintenant utiliser un outil, qui se situe icipour identifier l’erreur.
Je propose de la modifier simplement en mettant plus de gras:
Proposition a dit:
Nous allons maintenant utiliser un outil, qui se situe ici (http://yaml-online-parser.appspot.com/) pour identifier l’erreur.

Merci donc encore une fois (en espérant que les gens comprennent un peu mieux :p ) pour ce tutoriel.


Cordialement,
Detobel36
 
  • J'aime
Reactions: floflo777

Vicreaft

ok.
26 Juin 2012
242
39
136
Salut,

Je n'avais pas répondu à ce message n'ayant rien d'intéressant à dire (à part Merci (ce qui est tout de même important :p )).

Je fait donc ce message simplement pour demander si il était possible de mettre ce site très pratique plus en évidence. Nous parlons donc de cette phrase:

Je propose de la modifier simplement en mettant plus de gras:


Merci donc encore une fois (en espérant que les gens comprennent un peu mieux :p ) pour ce tutoriel.


Cordialement,
Detobel36

Je ne sais pas pourquoi je n'ai pas eu de notification pour ta réponse, ce qui explique mon retard :/
J'ai donc fait ce que tu m'as suggéré!

Amicalement,
Vicreaft
 
  • J'aime
Reactions: Detobel36