Base : Mémoire de pile insuffisante sur appel MsgBox "Hello World" ...

Bonjour,

Je développe une application LibreOffice Base et sans comprendre vraiment la
raison, du jours au lendemain, lorsque je rentre dans mon application
l'appel du premier script plante tout ... J'ai désactivé l'appel automatique
à la méthode d'ouverture du document et lorsque je fais un simple test
MsgBox "Hello World !" dans un nouveau module j'obtiens le message d'erreur
"Mémoire de pile insuffisante" ! Je n'ai alors d'autre choix que de tuer le
processus LIbreOffice ...

Ma configuration n'a pas changée, mais je suspecte une corruption dans le
profil utilisateur, sinon dans mon document Base lui même. J'ai l'impression
que quelque chose serait mal chargé et que l'instabilité qui en résulterait
causerait le crash au premier appel de macro ...

Est-ce quelqu'un aurait une idée pour la cause sinon pour mener un test
particulier avec XrayTool ou un autre moyen ?

Merci pour votre aide.
Patrick

Le message que tu reçois me fait penser à un appel récursif d'un fonction de manière infinie. Si tu utilises des fonctions récursives, peut-être devrais-tu examiner les conditions d'arrêt des appels récursifs.

Bonjour Patrick,

Je développe une application LibreOffice Base et sans comprendre vraiment la
raison, du jours au lendemain, lorsque je rentre dans mon application
l'appel du premier script plante tout ... J'ai désactivé l'appel automatique
à la méthode d'ouverture du document et lorsque je fais un simple test
MsgBox "Hello World !" dans un nouveau module j'obtiens le message d'erreur
"Mémoire de pile insuffisante" ! Je n'ai alors d'autre choix que de tuer le
processus LIbreOffice ...

typiquement, cette erreur survient lors d'appels récursifs ou en boucle (sous-prog A appelle sous-prog B qui appelle sous-prog C qui... qui appelle sous-prog A). L'empilement des appels jamais dépilés devient très vite énorme et sature la mémoire -> plantage.

Très cordialement,

/Je m'en suis douté, mais mon programme n'a aucun appel récursif .... Sur Libreoffice linux, le programme plante après l'affichage de ce message, et le point d'arrêt sur la ligne MsgBox "Hello World !" n'est pas atteint. Sur Windows, le point d'arrêt ne fonctionne pas mieux, mais la boite de message est affichée après l'affichage du message d'erreur. Dans ce dernier cas je peux observer une occupation soudaine du CPU à environ 40 % juste avant l'affichage du message d'erreur. De toute évidence une boucle est détectée, mais je suis incapable de comprendre laquelle. Lorsque Base me redonne la main, il place le curseur du code à la fin d'un module ne déclarant que des variables globales ... Et avant cela, il plaçait le curseur sur un Sub traitant un message d'une autre boite de dialogue (normalement) non sollicitée  ...
/

/Existerait-il une astuce pour la mettre en évidence cette boucle dans mon code ? Peut-être avec des traces ? Sauf que je lance ma macro en appuyant F8 dans ma Sub qui ne déclare que "Hello World" et j'ai l'impression que le problème viendrait d'une librairie ...
/

/Ce peut-il qu'une librairie soit corrompue, qu'un virus ait modifié le code ? J'ai découvert un virus dans mon fichier Base, avec Clamav sous Linux. Mais il n'était pas installé avant le virus et Clamav est dénoncé pour proposer de nombreux faux positifs. Par ailleurs un autre antivirus sur un autre poste m'indique le fichier sans virus... Donc cela pourrait confirmer un faux positif .../

Patrick

Bonsoir,

Peut-être que si nous avions le code source de cette macro ?

Thierry

Bonjour,

Je développe une application LibreOffice Base et sans comprendre vraiment la
raison, du jours au lendemain, lorsque je rentre dans mon application
l'appel du premier script plante tout ... J'ai désactivé l'appel automatique
à la méthode d'ouverture du document et lorsque je fais un simple test
MsgBox "Hello World !" dans un nouveau module j'obtiens le message d'erreur
"Mémoire de pile insuffisante" ! Je n'ai alors d'autre choix que de tuer le
processus LIbreOffice ...

Ma configuration n'a pas changée, mais je suspecte une corruption dans le
profil utilisateur, sinon dans mon document Base lui même. J'ai l'impression
que quelque chose serait mal chargé et que l'instabilité qui en résulterait
causerait le crash au premier appel de macro ...

le pb est-il systématique ?

Dans votre autre message, vous évoquez une corruption voire un virus. Même si on ne doit rien écarter, ce qui perturbe c'est votre "du jour au lendemain" et "configuration n'a pas changé". Il y a *nécessairement* quelque chose qui a changé.

Pouvez-vous essayer avec un profil neuf ? Je sais que cette suggestion relève souvent de l'incantation mais elle permet au moins d'écarter (ou pas) certains problèmes que, honnêtement, on voit de moins en mois.

Est-ce quelqu'un aurait une idée pour la cause sinon pour mener un test
particulier avec XrayTool ou un autre moyen ?

XRay ? Mmmm, non pas pour ce type de pb.

si j'en crois votre message "ailleurs", vous utilisez la version 6.0.6. Essayez avec la 6.1.3 ("Fresh") ou bien avec une version plus ancienne, comme la 5.4.7.2 (dernière de la branche 5).

Et puis, la question de Thierry est judicieuse : on peut voir le code ? Eventuellement, réalisez un sous-produit de votre programme qui montre le comportement inattendu.

Si vous répondez, merci de penser à utiliser la fonction "répondre à tous" de votre logiciel de courrier électronique de façon que la liste reçoive une copie de votre réponse.

Bien cordialement,

Bonjour,

Je viens de trouver la raison de ce bug :

Une seule macro évènement :

Sub CmdSelectionner(Event As Object)

On Local Error Goto Erreur

Set oCmdSelectAutorities = FabriquerTApplication.CmdSelectAutorities
    oCmdSelectAutorities.CmdSelectionner()

Exit_Sub:
     Exit Sub
Erreur:
     TraceError("ERROR", Err, Name, Erl)
     Stop
End Sub

qui avait le même nom qu'une variable global CmdSelectionner = 5000 déclarée dans un autre module. L'appel à la méthode oCmdSelectAutorities.CmdSelectionner() ne semble pas poser de problème, c'est du code pseudo object ...

A la compilation cela passe sans aucune erreur signalée (interprétation basic oblige diront certains sauf que dans mes modules je déclare quand même Option explicit ...

Je sais maintenant que chaque entorse au domaine des noms est dramatiquement fatidique pour LibreOffice Basic. Mais je ne m'attendais pas à un plantage aussi violent entraînant le crash du debugger (plus aucun point break positionnable) et le crash entier de l'application libreoffice avec l'ensemble des autres documents ouverts ... C'est un cloisonnement des process digne du Titanic ...

Et aussi je ne m'attendais pas à un syndrôme d'appel récursif provoqué par une variabe et une procédure ...

De plus cette macro n'était même pas appelée par mon application avant le crash, elle répondait à un bouton dans une boite de dialogue non ouverte. Mais je comprends que Basic précharge un maximum de code et je ne comprends pas bien ce qu'il fait avec ce code avant son execution ...

Existe-t-il une extension  module qui aide au développement, avec par exemple un précompilateur pour vérifier la redondance des variables et valider un maximum de règles spécifiques au langage Basic OOo ?

Merci déjà pour votre réponse...
Patrick

Bonjour,

Mon sentiment au sujet du développement de Macros sur LibreOffice est qu'on peut faire beaucoup de choses, mais qu'il faut être extrêmement prudent. Il n'y a à ma connaissance que très peu d'outils fournissant ceinture ou bretelle, le seul remède est d'être très attentif. Je pense aussi qu'il est prudent de ne pas viser trop haut, de ne pas vouloir forcément informatiser Total juste avec LibreOffice, comme image. Mon appréciation personnelle est qu'il s'agit d'une suite bureautique, qu'on peut l'adapter au domaine traité, mais qu'il est sage de rester raisonnable dans ses ambitions.

Toutefois Jean-François peut avoir une autre opinion, plus étayée, que moi sur ce sujet. De toutes manières il est bon de se référer aux docs qu'il a produites, ses fiches sont vraiment des gagnes-temps remarquables.

Thierry

Bonjour,

Il n'est pas besoin d'écrire beaucoup de code pour perdre beaucoup de temps à déboguer avec ce basic... Je crois qu'on est loin de ceinture et bretelle, juste ceinture ou bretelle ce serait déjà bien ...

Je pense qu'avec Microsoft Access et le langage Visual Basic, qui si je l'ai bien compris serait object, l'environnement me semble plus intéressant. Mais loin de moi l'idée de solliciter MS$. Aussi le projet de librairie Access2Base présente l'objectif de fournir environ 200 commandes pour programmer une base, en ce basant sur Access, à la place de l'usine a gaz Uno, serait un bon moyen de simplifier la programmation d'une base sans limiter les besoins des utilisateurs. On peut aussi voir les choses autrement et se dire que si l'on produit trop de code c'est que le framework de base n'est pas bon. Voir à ce sujet Paul Dilazia qui dans son livre Windows++ critiquait les interfaces de MS$...

Je n'ai pas la prétention de produire une application d'entreprise avec LibreOffice, mais l'intérêt d'avoir ma base qu coeur de la suite bureautique est de faciliter l'intégration à la production des documents.

Selon moi il y a quelques fonctionnalités attendues pour simplifier la programmation d'une base, je dirais des fonctions pour gérer des Smarts forms et remplacer ce langage basic  par Java ou Python mais avec une documentation complète que je n'ai pas encore trouver...A noter que je ne trouve d'avantage de livre spécifique à la programmation de Uno ...

Sinon, quelle alternative à Base pour développer rapidement les interfaces d'une base de donnée compatible sur Windows et Linux, pouvant s'exécuter sur une simple clé USB: Lazarus ? Un autre RAD Open source ?

Patrick

Bonsoir,

Pour des choses sérieuses, je prendrais Lazarus et Postgresql. C'est de l'artillerie lourde, mais c'est aussi très agréable à utiliser. Côté Windows et Linux je n'ai pas eu de soucis (je n'ai fait que des tests, rien de bien sérieux mais ça semble vraiment encourageant), par contre sur Mac on a pas mal de soucis d'installation, puis de librairies pour attaquer Postgres. Il semble que ça se résolve avec le temps, mais c'était assez gênant.

Ne croyez pas ceux qui vous parlent de BASIC objets chez M$ : Pour eux, un objet est une forme qu'on place sur l'écran, un bouton, un champ ! Rien à voir avec C++ ou Smalltalk. Ca m'a fait rager depuis la sortie de ce BASIC, car j'ai dû me battre avec des innocents qui voulaient l'utiliser pour écrire de grosses applications, par opposition à Delphi à l'époque dans ses toutes premières versions. J'ai partiellement gagné, l'application qui a finalement été développée avec MS-BASIC est à la poubelle depuis longtemps, celles qui l'ont été avec Delphi tournent toujours et continuent à évoluer. Na !

En passant, Delphi reste une plateforme très crédible, même si c'est devenu un monstre avec le temps. Si vous avez vraiment de gros besoins et que vous pouvez financer la licence, c'est un bon choix aussi.

Bonne soirée,

Thierry

Bonsoir,

Merci pour votre réponse :slight_smile: Cela confirme mon impression. Côté budget je serais plus tourné Lazarus que elphi ... Je regrette que Delphi soit devenu si cher, je l'ai connu dans ses premières versions et j'aime beaucoup. Par conte la gestion des composants sous Lazarus c'est pas toujours simple ...

Postresql est définitivement intéressant. Mais quand est t-il de son fonctionnement sur une clé USB ? Avec HSQLDB je comprends qu'il me suffit d'un simple fichier HSQLDB.jar pour attaquer ma base dans quelques fichiers, mais quand est-il d'un serveur Postgresql sur clé USB ? Sauf erreur de ma part je crois comprendre qu'il serait peut être question de remplacer HSQLDB dans Base par Firebird ... Mais je crois que le connecteur Firebird est SDBC. Personnellement je préfère travailler avec JDBC car j'avais essayé ODBC et j'étais très déçu des performances et des pertes de fonctionnalités causés par les drivers, sans compte que la doc est une vraie usine à gaz ... J'avais aussi tester SQLite  il y a deux ans environ, mais j'étais très déçu du fait qu'il ne supportait pas les contraintes sur les clés étrangères. Ce que je cherche c'est à faire tourner une base de gestion sur une clé USB et à produire des rapports avec Jaspersoft. D'après e que j'ai compris des rapports dans Base cela me semble complètement inutilisable ...

Maintenant pour l'interface je cherchais un RAD. J'ai produit quelques forms avec Lazarus mais au début il y a tout de même pas mal de code à mettre en place pour faire fonctionner la form. De ce côté Base est plus rapide, même si lorsqu'on commence à coder on perd l'avantage. Je me demande également si utiliser un ORB comme Hibernat avec une appli java sous QT ne serait pas aussi rapide que Lazarus, même si je devrais me former à Hibernate, ce n'est jamais qu'un livre ...

Et du côté de Smalltalk, Eiffel ou Lisp, savez-vous q'il y aurait des outils pour faire du RAD avec une base de donnée ?

Patrick

----- Mail original -----

De: "Thierry Jeanneret" <thierry.jeanneret@gmail.com>
À: "patrick gelin" <patrick.gelin@free.fr>
Cc: "users LibreOffice LO" <users@fr.libreoffice.org>, "Jean-Francois Nifenecker"
<jean-francois.nifenecker@laposte.net>
Envoyé: Mercredi 7 Novembre 2018 18:44:53
Objet: Re: [fr-users] Base : Mémoire de pile insuffisante sur appel MsgBox "Hello World" ...

Bonsoir,

Pour des choses sérieuses, je prendrais Lazarus et Postgresql. C'est
de l'artillerie lourde, mais c'est aussi très agréable à utiliser.
Côté Windows et Linux je n'ai pas eu de soucis (je n'ai fait que des
tests, rien de bien sérieux mais ça semble vraiment encourageant),
par contre sur Mac on a pas mal de soucis d'installation, puis de
librairies pour attaquer Postgres. Il semble que ça se résolve avec
le temps, mais c'était assez gênant.

Ne croyez pas ceux qui vous parlent de BASIC objets chez M$ : Pour
eux, un objet est une forme qu'on place sur l'écran, un bouton, un
champ ! Rien à voir avec C++ ou Smalltalk. Ca m'a fait rager depuis
la sortie de ce BASIC, car j'ai dû me battre avec des innocents qui
voulaient l'utiliser pour écrire de grosses applications, par
opposition à Delphi à l'époque dans ses toutes premières versions.
J'ai partiellement gagné, l'application qui a finalement été
développée avec MS-BASIC est à la poubelle depuis longtemps, celles
qui l'ont été avec Delphi tournent toujours et continuent à évoluer.
Na !

En passant, Delphi reste une plateforme très crédible, même si c'est
devenu un monstre avec le temps. Si vous avez vraiment de gros
besoins et que vous pouvez financer la licence, c'est un bon choix
aussi.

Bonne soirée,

Thierry

bonjour,

voici les tutos sur free pascal :

http://wiki.freepascal.org/SQLdb_Tutorial1
http://wiki.freepascal.org/postgres

http://wiki.freepascal.org/postgres

les tutos PgSQL :
https://www.postgresql.org/download/windows/
https://wiki.postgresql.org/wiki/PostgreSQL_Tutorials

https://www.postgresql.org/docs/current/tutorial.html

pour administrer :

https://alternativeto.net/software/heidisql/
https://dbeaver.io/
http://phppgadmin.sourceforge.net/doku.php

petit détail rechercher sur le net une question que
j'ai posé sur la liste PgSQL à propos du "pg hba.conf"

merci
slt
bernard

Re,

Sur Mac il existe une version "light" de Postgresql, nommée Postgres.app, qui s'exécute sans installation. On balance le truc dans le dossier Applications, double-click et la messe est dite. Ca vaut la peine de vérifier qu'il n'en existe pas une version pour les autres OS.

Pour le reste, je fuis en principe Java. Au début c'était une belle idée, mais aujourd'hui c'est devenu un monstre. Ce n'est pas une clé USB qu'il vous faudra pour tourner votre petite application, mais tout un trousseau :wink: J'ai constaté les dégâts que fait cette plateforme, et je me suis arrêté là. Donc je n'ai pas d'expérience d'Hibernate, mais ça ne me manque pas vraiment !

Il y a fort longtemps que j'ai abandonné Smalltalk, et je n'ai jamais été vraiment séduit. Lisp, j'aimais bien, mais là aussi, ça fait des années… J'ai voulu Eiffel, puis j'ai renoncé, trop pris ailleurs. En résumé, je ne peux pas vous aider du tout !

En passant, vous devriez refaire un tour sur Lazarus, aujourd'hui c'est tout comme Delphi pour ce qui est du code. Et lorsqu'on recherche des fonctions un peu ergonomiques, comme le glisser-déposer, c'est bien plus simple…

Entre nous, imaginez-vous que parfois je caresse le fantasme de prendre un petit moteur de BD, genre dBase III/Clipper, et de construire autour un 4GL simple et performant. Je ne suis pas encore assez vieux pour avoir cessé de rêver, et il n'est pas dit qu'un jour…

Thierry

Bonsoir,

Bonsoir,

Pour des choses sérieuses, je prendrais Lazarus et Postgresql. C'est de l'artillerie lourde, mais c'est aussi très agréable à utiliser. Côté Windows et Linux je n'ai pas eu de soucis (je n'ai fait que des tests, rien de bien sérieux mais ça semble vraiment encourageant), par contre sur Mac on a pas mal de soucis d'installation, puis de librairies pour attaquer Postgres. Il semble que ça se résolve avec le temps, mais c'était assez gênant.

Ne croyez pas ceux qui vous parlent de BASIC objets chez M$ : Pour eux, un objet est une forme qu'on place sur l'écran, un bouton, un champ ! Rien à voir avec C++ ou Smalltalk. Ca m'a fait rager depuis la sortie de ce BASIC, car j'ai dû me battre avec des innocents qui voulaient l'utiliser pour écrire de grosses applications, par opposition à Delphi à l'époque dans ses toutes premières versions. J'ai partiellement gagné, l'application qui a finalement été développée avec MS-BASIC est à la poubelle depuis longtemps, celles qui l'ont été avec Delphi tournent toujours et continuent à évoluer. Na !

En passant, Delphi reste une plateforme très crédible, même si c'est devenu un monstre avec le temps. Si vous avez vraiment de gros besoins et que vous pouvez financer la licence, c'est un bon choix aussi.

je partage le point de vue de Thierry. J'ai travaillé longtemps sous Delphi (jusqu'à la version 2005 incluse). Venant d'un passé Turbo-Pascalien très ancien, j'ai beaucoup aimé ce langage : clair, précis, fortement typé, et vraiment objet (même si des puristes à la Eiffel pourraient trouver à redire). Ce langage (Pascal) oblige à prendre de bonnes habitudes.

J'utilise encore ponctuellement Lazarus qui est un très bon outil et me fournit ce que j'ai connu sous Delphi (et qui me satisfait). Son intérêt -- à la réserve près soulevée par Thierry (mais je n'ai jamais utilisé la Pomme) -- est aussi qu'il est multi-plateformes. Conjointement avec PostgreSQL on obtient un bon couple. Je suggérerais aussi d'essayer Firebird pour sa compatibilité éventuelle avec LibreOffice (et ses liens très anciens avec Delphi !) Je ne désespère pas de le faire, d'ailleurs.

Pour moi, LibO Basic n'est rien d'autre que ça : un Basic. Il me fournit tous les outils dont j'ai besoin pour obtenir ce dont j'ai besoin sous LibO. Je n'en attends pas plus et, comme dit par Thierry dans un autre message, il ne faut pas lui demander plus que ce qu'il permet de faire simplement.

Si j'avais le temps, je m'essaierais à Python pour piloter LibO. Mais là, clairement, des journées de 96 heures n'y suffiraient pas.

Bonne recherche et bon courage, Patrick,
Très cordialement,

Patrick,

Bonjour,

Je viens de trouver la raison de ce bug :

\o/

Une seule macro évènement :

Sub CmdSelectionner(Event As Object)

qui avait le même nom qu'une variable global CmdSelectionner = 5000 déclarée dans un autre module.

-> dotez-vous d'un standard de nommage des entités et ça n'arrivera plus.

Je procède ainsi depuis mes premiers pas en Pascal, à tel point qu'il m'est maintenant souvent pénible de lire les bouts de code que j'ai l'occasion de consulter.

Ca ne garantira pas l'absence de bugs mais ça vous aidera fichtrement à vous lire (l'ordinateur, on s'en fiche).

Recherchez ces termes sur internet, vous trouverez des tas d'articles très bien écrits et qui vous y aideront.

A la compilation cela passe sans aucune erreur signalée (interprétation basic oblige diront certains sauf que dans mes modules je déclare quand même Option explicit ...

oui, Basic n'est pas un langage très "sûr" (peu typé; très, trop permissif...)

Et aussi je ne m'attendais pas à un syndrôme d'appel récursif provoqué par une variabe et une procédure ...

même si je ne suis pas étonné a posteriori, je ne m'y serais pas attendu non plus.

De plus cette macro n'était même pas appelée par mon application avant le crash, elle répondait à un bouton dans une boite de dialogue non ouverte. Mais je comprends que Basic précharge un maximum de code et je ne comprends pas bien ce qu'il fait avec ce code avant son execution ...

Vous comprenez maintenant ce que "faille par injection de code" veut dire.

Existe-t-il une extension  module qui aide au développement, avec par exemple un précompilateur pour vérifier la redondance des variables et valider un maximum de règles spécifiques au langage Basic OOo ?

Non, pas encore. Je me suis essayé à créer un outil de recensement des identifiants d'un programme et de leurs appels. En Basic c'est horrible à gérer et je n'y ai réussi qu'à moitié (verre à moitié plein :wink:
Le reste... reste en plan faute de temps. Et probablement que ce serait beaucoup plus "facile" à programmer en Python.

Mais d'autres se penchent peut-être sur le sujet...

Basic et l'IDE LibO sont très pauvres (idem sous VBA, hein ? pour autant que j'aie pu voir). En fait, de mon point de vue, c'est là qu'est le gros écueil : ces langages et environnements permettent difficilement de documenter le travail (et même font tout pour qu'il ne le soit pas), par conséquent ne donnent/poussent pas vers les bonnes habitudes. D'où du code souvent incompréhensible par quiconque hormis le concepteur (voire). D'où une réputation souvent méritée...

Très cordialement,