Technical discussions | Discussions techniques
Subscription date : 14 January 2008
Messages : 1122
|
Dites, je pensais : c'est pas tiptop que si un plugin plante ca fasse tout planter...
Alors pourquoi ne pas introduire des exceptions au lancement des plugins ?
En C c'est possible moyennant un petit hack (http://www.cppfrance.com/codes/EXCEPTION-SIMULER-TRY-CATCH-THROW_40259.aspx)
En gtk je sais pas s'il y a un truc mieux.
Sinon il y a la solution de threader le lancement de chaque plugin mais ca risque d'etre plus dur à gérer...
Et puis tant qu'on y est pourquoi ne pas gérer les exceptions tout au long de l'execution des plugins...
Je vois ca comme ca :
si un plugin essaye de faire un NULL->quelquechose
on affiche : le plugin xxxx essaye d'accéder à une zone de mémoire nulle il est donc désactivé
et hop on est tranquille...
Vous en pensez quoi ? |
Subscription date : 29 November 2007
Messages : 7408
|
+1
C'est vrai qu'avec la fonction --maintenance , on arrive désormais à lancer notre thème en désactivant l'applet responsable du plantage ... mais ce n'est pas le top car il faut déjà trouver celle qui plante
.... Et puis l'autre GROS avantage de ta proposition, cela permettrait de voir les applets qui plantent en cours d'utilisation -> Actuellement, il m'arrive d'avoir le dock qui se ferme tout seul, mais vu que je ne lance pas systématiquement avec ddd .... Va trouver la cause !
Bref, si on voit qu'une applet en particulier se ferme, cela permet de mettre sur la voie |
Subscription date : 12 May 2008
Messages : 140
|
ouep par exemple l'applet switcher dans la rev 1064 qui seg fault le cairo |
Subscription date : 29 November 2007
Messages : 7408
|
Pas de problème avec switcher chez moi en 1064 |
Subscription date : 12 May 2008
Messages : 140
|
ha?
chez moi c'est segmentation fault |
Subscription date : 30 November 2007
Messages : 17118
|
je jète un oeil au hack
Edit : je comprends pas en quoi ça empêche un plug-in de planter, ni même de savoir lequel a planté et où. |
Subscription date : 14 January 2008
Messages : 1122
|
au temps pour moi je pensais que ca aurait pu gérer les segfault de maniere moins radicale...
L'idée reste quand meme la : ne pas planter le dock quand un plugin plante ca doit etre possible non ?
Sinon j'ai trouvé ca aussi, ya des trucs qui ont l'air bien sympa (enfin tu connais peut etre tout déjà) : http://julian-ibarz.developpez.com/tutorials/glib/erreurs/ |
Subscription date : 30 November 2007
Messages : 17118
|
ah oui les erreurs de la glib j'utilise, le problème c'est que là on parle d'erreurs de segmentation, donc des bugs, donc que tu récupères pas (sinon ce serait plus des bugs ), et malheureusement quand un programme fait un double free ou autre boulette, ça core ! |
Subscription date : 14 January 2008
Messages : 1122
|
les languages évolué il les gere ca il me semble du moins ils plantent pas comme des sales il plantent avec classe...
si on thread tous les plugins si y'en a un qui tombe les autres sont pas (trop) touché si ? |
Subscription date : 30 November 2007
Messages : 17118
|
peut-être en interceptant les signaux (sig_term et compagnie) on pourrait empêcher le dock de se fermer, mais je sais pas si c'est bien utile de laisser tourner l'appli avec des zones mémoires corrompues.
c'est une idée comme ça je suis même pas sûr que ça se fasse. |
Subscription date : 14 January 2008
Messages : 1122
|
disons que si le dock plante c'est mieux de le fermer (et de le relancer meme ca c'est classe...)
par contre si c'est un plugin qui est mal codé (je dis pas ca pour toi mais shortcut par exemple qui a une époque n'arretait pas de planter) je trouve ca mieux de killer le thread du plugin que tout killer, normalement si c'est avec sa propre zone mémoire qu'il fait de la merde ca risque de n'avoir aucune influence sur les autres...
Sinon en ce qui concerne l'interception des signaux il me semble que c'est ce que font nos potes de compiz :
static CompDisplay *cDisplay;
static void
crash_handler (int sig)
{
if (sig == SIGSEGV || sig == SIGFPE || sig == SIGILL || sig == SIGABRT)
{
static int count = 0;
if (++count > 1)
exit (1);
char cmd[1024];
snprintf (cmd, 1024,
"echo -e \"set prompt\nthread apply all bt full\n"
"echo \\\\\\n\necho \\\\\\n\nbt\nquit\" > /tmp/gdb.tmp;"
"gdb -q %s %i < /tmp/gdb.tmp | "
"grep -v \"No symbol table\" | "
"tee %s/compiz_crash-%i.out; rm -f /tmp/gdb.tmp; "
"echo \"\n[CRASH_HANDLER]: "
"\\\"%s/compiz_crash-%i.out\\\" created!\n\"",
programName, getpid (), crashhandlerGetDirectory (cDisplay),
getpid (), crashhandlerGetDirectory (cDisplay), getpid () );
system (cmd);
if (crashhandlerGetStartWm (cDisplay) )
{
if (fork () == 0)
{
setsid ();
putenv (cDisplay->displayString);
execl ("/bin/sh", "/bin/sh", "-c",
crashhandlerGetWmCmd (cDisplay), NULL);
exit (0);
}
}
exit (1);
}
}
static void
crashhandlerDisplayOptionChanged (CompDisplay *d,
CompOption *opt,
CrashhandlerDisplayOptions num)
{
switch (num)
{
case CrashhandlerDisplayOptionEnabled:
if (crashhandlerGetEnabled (d) )
{
signal (SIGSEGV, crash_handler);
signal (SIGFPE, crash_handler);
signal (SIGILL, crash_handler);
signal (SIGABRT, crash_handler);
}
else
{
signal (SIGSEGV, SIG_DFL);
signal (SIGFPE, SIG_DFL);
signal (SIGILL, SIG_DFL);
signal (SIGABRT, SIG_DFL);
}
break;
default:
break;
}
}
static Bool
crashhandlerInitDisplay (CompPlugin *p,
CompDisplay *d)
{
cDisplay = d;
if (!checkPluginABI ("core", CORE_ABIVERSION))
return FALSE;
if (crashhandlerGetEnabled (d) )
{
signal (SIGSEGV, crash_handler);
signal (SIGFPE, crash_handler);
signal (SIGILL, crash_handler);
signal (SIGABRT, crash_handler);
}
crashhandlerSetEnabledNotify (d, crashhandlerDisplayOptionChanged);
return TRUE;
}
static void
crashhandlerFiniDisplay (CompPlugin *p,
CompDisplay *d)
{
signal (SIGSEGV, SIG_DFL);
signal (SIGFPE, SIG_DFL);
signal (SIGILL, SIG_DFL);
signal (SIGABRT, SIG_DFL);
}
static CompBool
crashhandlerInitObject (CompPlugin *p,
CompObject *o)
{
static InitPluginObjectProc dispTab[] = {
(InitPluginObjectProc) 0, (InitPluginObjectProc) crashhandlerInitDisplay
};
RETURN_DISPATCH (o, dispTab, ARRAY_SIZE (dispTab), TRUE, (p, o));
}
static void
crashhandlerFiniObject (CompPlugin *p,
CompObject *o)
{
static FiniPluginObjectProc dispTab[] = {
(FiniPluginObjectProc) 0, (FiniPluginObjectProc) crashhandlerFiniDisplay
};
DISPATCH (o, dispTab, ARRAY_SIZE (dispTab), (p, o));
}
CompPluginVTable crashhandlerVTable = {
"crashhandler",
0,
0,
0,
crashhandlerInitObject,
crashhandlerFiniObject,
0,
0
};
CompPluginVTable *
getCompPluginInfo (void)
{
return &crashhandlerVTable;
}
|
fabounet, Wednesday 04 June 2008 à 17:45
|
|
Subscription date : 30 November 2007
Messages : 17118
|
ah ouais exact
au 1er sigsegv il chope les backtraces et relance le WM de départ, si c'est le 2ème sigsegv il quitte brutalement.
visiblement c'est possible de se forker soi-même et de quitter, donc en fait de se relancer, je savais pas.
à tester ! |
Guest, Sunday 08 June 2008 à 11:24
|
|
|
le fork, tien sa me rapelle les forks bombs en shell sur un pIII
(attention: ce code shell fera freezer le systeme reboot obligatoire après!) |
Subscription date : 30 November 2007
Messages : 17118
|
bon j'ai fai tun truc qui permet de relancer le dock automatiquement en cas de plantage
par contre on ne sait pas qui a fait planté, donc pas de désactivation automatique de plug-in.
en acs de plantage pendant le chargement, le mode maintenance est activé, ce qui permet d'éviter les plantages/relancement en boucle. |
ChAnGFu, Friday 13 June 2008 à 13:54
|
|
Subscription date : 17 January 2008
Messages : 1526
|
Excellent! |
Subscription date : 14 January 2008
Messages : 1122
|
cool !!
Mon intervention limitée n'aura pas servie à rien |
Technical discussions | Discussions techniques
|