2 votes

l'exécution d'un script s'arrête en plein milieu

J'ai un script qui fait des calculs et enregistre des tracés invisibles dans des fichiers images à l'intérieur d'une boucle for sur un serveur linux.

Lorsque je lance le script, il reste généralement bloqué quelque part au milieu. Je ne sais pas exactement où il s'est arrêté, mais je peux savoir à quelle itération de la boucle for il s'arrête grâce à l'impression. Si je le relance à partir de l'itération où il s'est arrêté, il peut continuer à s'exécuter au-delà de cet endroit. Il me semble donc qu'il n'y a pas de bogue.

Je me demande simplement comment je peux identifier la ligne à laquelle il s'arrête ?

Quelle peut être la cause du problème et comment puis-je exécuter l'ensemble du script du début jusqu'à la fin ?

T


U

J'utilise dbstop

dbstop if error  
dbstop if warning  
run path2script

L'exécution reste toujours bloquée quelque part et aucun message n'est donné quant à la raison de ce blocage.

1voto

Dennis Jaheruddin Points 10154

Voici un moyen de savoir ce qui se passe :

  1. Allumer dbstop if error

  2. Lorsque votre code est vraiment bloqué, appuyez sur CTRL+C, ce qui vous permettra d'inspecter la situation et de voir ce qui se passe.

  3. Si regarder ne suffit pas : sélectionnez la ligne où l'erreur a été induite et appuyez sur f9.

  4. Si vous ne trouvez toujours pas l'erreur, placez un point d'arrêt conditionnel qui ne se déclenche que lorsque vous atteignez les conditions pendant/après lesquelles l'erreur se produit. Si ce point est atteint plusieurs fois, vous êtes bloqué dans une boucle d'une manière ou d'une autre.

Sidenote : Si vous n'êtes pas sûr d'être dans une boucle, les versions récentes de Matlab ont un bouton d'autoformatage, utilisez-le !

0voto

Eli Points 1051

De quel type de script s'agit-il ?

Vous manquez de mémoire ? Si vous dépassez la taille maximale du tas alloué, le système peut se bloquer. Lorsque vous le relancez, il démarre avec toute la mémoire dont il disposait à l'origine et peut s'exécuter jusqu'à la fin avant d'utiliser à nouveau toute sa mémoire.

Je recommande de vérifier s'il y a des fuites de mémoire.

0voto

Dima Points 19888

Que se passe-t-il exactement lorsque votre script est "bloqué" ? Est-ce qu'il revient à l'invite, ou est-ce que matlab se bloque simplement ? Si c'est ce dernier cas, il semble que vous ayez une boucle infinie dans votre code...

0voto

groovingandi Points 1568

Difficile à dire sans connaître le script et l'environnement. Êtes-vous sûr qu'il est bloqué et qu'il n'est pas simplement occupé à calculer quelque chose ou à obtenir plus de mémoire ? Vous pouvez essayer de placer un point d'arrêt conditionnel peu avant l'itération où le blocage se produit, puis parcourir interactivement le code suivant à l'aide du débogueur.

0voto

AlexC Points 686

Comme le suggère groovingandi, placez un point d'arrêt conditionnel dans votre code au début de l'itération où la boucle for se bloque normalement. Vous pouvez le faire avec une commande comme :

dbstop in runscript at 500 if iLoop==365 
% where 500 is the first line within the for loop,
% and 365 is the iteration causing problems

Si votre script reste bloqué sans point d'arrêt, mais peut continuer allègrement au-delà de ce point si vous utilisez des points d'arrêt et continuez ensuite, cela indique normalement que vous avez une défaillance sporadique qui dépend du temps, peut-être une condition de course. Peut-être écrivez-vous un fichier dans le système d'exploitation, puis immédiatement après, vous regardez le système d'exploitation pour savoir quel doit être le nom du prochain fichier, mais votre système de fichiers est légèrement en cache ? Des choses de ce genre m'ont causé des problèmes similaires.

Examinez attentivement ce que fait votre code à chaque fois que vous faites le tour de la boucle, afin de déceler tout ce qui pourrait dépendre d'étapes antérieures exécutées de manière asynchrone.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X