7
votes

Comment gérer les défauts SEG sous Windows?

Comment une application Windows peut-elle gérer les défauts de segmentation? Par «gérer», je veux dire les intercepter et peut-être émis un message descriptif. En outre, la capacité de se remettre d'eux serait bien aussi, mais je suppose que c'est trop compliqué.


0 commentaires

6 Réponses :


5
votes

Laissez-les planter et laissez la manipulation des erreurs de Windows. Sous Vista +, vous devez également envisager d'enregistrer avec Redemod Manager, de sorte que vous ayez une chance d'économiser le travail de l'utilisateur et de redémarrer l'application (comme quel mot / Excel / Excel / Excel / Excel / etc .. fait)


2 commentaires

Comment s'inscrire à ce gestionnaire de redémarrage?


@George, c'est extrêmement facile, consultez MSDN.MicRosoft. COM / EN-US / Bibliothèque / AA373347 (vs.85) .aspx



3
votes

Utilisez Seh pour une exception précoce manutention, et utilisez SetunhandleXceptionFilter pour montrer un message descriptif .


5 commentaires

Est-ce que les blocs __try et __except fonctionnent avec d'autres compilateurs Windows comme Mingw32? (Pas seulement VC ++)


Vous pouvez descendre cet itinéraire (bien que je vous encourageais à vérifier ce que WER peut faire pour vous, vous peut vous enregistrer pour obtenir les rapports / fournir des liens problématiques!) - N'oubliez pas que votre application sera Dans un état très hosté dans le filtre, vous serez assez limité à ce que vous pouvez faire en toute sécurité; Tout ce qui implique de nouveaux / Supprimer est par exemple.


Je suppose que je vais rester avec VC ++.


Après avoir appris ce qui est, il est vraiment pratique de gérer le crash des applications. Je recommande également WER MAINTENANT. Mais quand essayé l'échantillon de WER n'est pas en charge Windows XP.


Découvrez Libseh pour (Mingw32, Cygwin) ProgrammingUnlimited.net/siteexec/content.cgi ? Page = Libseh et ProgrammingUnlimited.net/siteeexec/Content .cgi? Page = Mingw-Seh



0
votes

Ce que vous voulez faire ici dépend de quel type de fautes vous concernez. Si vous avez du code bâclé qui est sujet à des violations de protection générales plus ou moins aléatoires, la réponse @Paul Betts est ce dont vous avez besoin.

Si vous avez du code qui a une bonne raison pour la déférence Bad Pointerers, et que vous souhaitez récupérer, commencez par la suggestion de @ Whunmr sur SEH. Vous pouvez gérer et réellement récupérer, si vous avez suffisamment de contrôle suffisamment de votre code pour savoir exactement quel état il est au point de la faute et sur la façon de se remettre.


4 commentaires

J'espère que mon code n'est pas bâclé :) La plupart des défauts de mon application proviennent de l'interprète Python encastré. Certains scripts semblent causer des problèmes.


Si vous jetez et recréez l'interprète et si ce processus ne fuit pas, vous êtes prêt à partir.


Dommage que ce soit une option.


Mettre python dans son propre processus et communiquer via des tuyaux ou des fichiers?



2
votes

Si vous ajoutez l'argument compilateur / eha Essayez {} Catch (...) attrapera toutes les exceptions pour vous, y compris les exceptions suivantes.
Vous pouvez également utiliser __ essayer {} __except {} qui vous donne plus de flexibilité sur ce qu'il faut faire lorsqu'une exception est capturée. Mettre un __ Essayez {} __except {} sur votre ensemble Main () La fonction est un peu équivalente à l'utilisation de setunhandeledexceptionfilter () . .

Cela étant dit, vous devez également utiliser la terminologie appropriée. "Défaut SEG" est un terme Unix. Il n'y a pas de défauts de segmentation sur Windows. Sous Windows, ils sont appelés "Exceopnts de violation d'accès"


4 commentaires

Un avertissement: Activation / EHA est une recette d'introduction de vulnérabilités de sécurité dans votre application. Le problème est qu'il existe des exceptions qui sont lancées par le système d'exploitation (comme des exceptions de page de garde) qui peuvent être correctement filtrées si vous utilisez le filtre __except, mais si vous utilisez / EHA et essayez {} Catch () Vous ne pourrez pas déterminer s'il est approprié de laisser le système d'exploitation manipuler l'exception. Les exceptions structurées sont extrêmement difficiles à obtenir directement sans introduire des défauts de sécurité, IMHO Paul Betts Répondre est à droite - laissez le système d'exploitation gérer l'erreur.


Je pensais que j'avais expliqué la question ci-dessus. Des exceptions de masquage comme des exceptions de page de garde ou des erreurs d'accès à la mémoire aléatoire peuvent introduire des trous de sécurité (par exemple, si vous attrapez des erreurs d'accès à la mémoire, un attaquant peut l'utiliser pour vaincre les protections de la plate-forme telles que ASLR - il y avait au moins un bulletin récent de la sécurité du MSFT causé par ce problème).


Toutes mes excuses pour le vote en voiture. Mauvais-clic accidentel et puis n'a pas découvert mon vote avant qu'il ne soit verrouillé.


La manipulation des exceptions SEH n'est pas une boîte noire. Si le code d'erreur est bien connu ... et est quelque chose que vous pouvez ignorer ... vous pouvez les gérer. __try, __except est la bonne façon de le faire.



0
votes

Exemple autonome C ++ sur la manière d'utiliser setunhandlexceptionfilter , déclenchant un défaut d'écriture et affichant un bon message d'erreur: xxx

testé avec succès avec g ++ (et doit fonctionner correctement avec MSVC ++)


0 commentaires

0
votes

Semblable Solution de Jean-François Fabre, mais avec code POSIX dans MINGW-W64. Mais notez que le programme doit quitter - il ne peut pas récupérer de la SIGSEGV et continuer.

#include <stdio.h>
#include <signal.h>
#include <stdlib.h>

void sigHandler(int s)
{
    printf("signal %d\n", s);
    exit(1);
}

int main()
{
    signal(SIGSEGV, sigHandler);
    int *v=0;
    *v = 0;   // trigger the fault

    return 0; 
}


0 commentaires