Question

J'ai actuellement un problème mettant en œuvre le scénario suivant en utilisant la configuration suivante:. GCC 3.4, Linux

J'ai écrit un outil (en C ++) qui charge une bibliothèque partagée (écrit en C). Cette bibliothèque a un bug que je ne peux pas influencer à corriger. Le problème est qu'il lit une entrée et sortie décodée écrit. Parfois, si l'entrée est mauvaise, cette bibliothèque sans faire aucune vérification commence le décodage des zones de mémoire suivantes. Cela provoque une erreur de segmentation.

Dans un premier temps mon idée était de mettre l'entrée dans la mémoire paginée (linux mmap-syscall) et de protection (mprotect) la dernière page, contre l'accès. En installant un propre SIGSEGV gestionnaire mon C ++ - App peut lancer une exception (lorsqu'il est compilé avec GCC-drapeau -fnon appel-exceptions). Cette exception interrompt la lecture du C lib. Je connais que cette lib n'alloue pas de mémoire (ou d'autres ressources), ce qui pourrait être perdue pendant pile déroulement. Le scénario tout fonctionnait bien dans mes tests unitaires, où tout était une seule application C ++. Mais maintenant, quand le code C du lib est appelé mon application se termine juste ... Dois-je besoin de reconstruire ce C-SO avec -fnon-call-exceptions drapeau ainsi? Je ne peux pas compiler cette lib, mais seulement re-lien, puisque j'ai accès à obj fichiers uniquement.

Voici l'image de l'environnement d'exécution:

+------------C++ APP----------+
|                             |
| Install SIGSEGV handler     |
| code calling C SO functions |
|                             |
|   +----------C SO Functions------------+
|   |   execute producing SIGSEGV        |
|   +------------------------------------+
|                             |
| SIGSEGV Handler called      |
|   => throw Exception        |
|      to stop execution of   |
|      C function             |
+-----------------------------+

D'autres suggestions sont les bienvenus.

Merci,

Ovanes


P.S. Je vois quelques suggestions et critiques, mais ils sont tous pas optin. Voici pourquoi: je ne dispose que d'une seule interface, où je peux créer un lien vers la bibliothèque. La bibliothèque est utilisée pour décoder les structures de données. Le problème est que si j'ai un réseau avec la longueur de la bibliothèque -1 commence à décoder le réseau de 0xffffff de longueur (sur un système 32 bits). En attendant que la lib se bloque dans un processus distinct est pas une option à mon avis. Tout d'abord, le décodage prendra ammount considarable de temps, d'une part et produira beaucoup de déchets sur l'autre. Depuis besoin de mon outil pour montrer la sortie décodée de manière fiable aux utilisateurs. Et ils ont encore besoin d'être en mesure de comprendre les traces.

Je ne vois pas le point ici pour travailler autour d'un SIGSEGV. Tout d'abord, la bibliothèque lit les données et l'écrit dans le descripteur de fichier que je passais devant. Je peux configurer comment écrire à cette poignée (tampon ou non). De plus, je sais exactement ce qu'il n'alloue pas de données en tas ou des ressources. Et enfin, il essaie de mémoire que mon application protégée pour éviter de telles erreurs. Du point de vue de l'utilisateur, je ne peux pas dire à quelqu'un: Désolé la trace binaire était seulement décodable moitié, parce que certaines données étaient incompatibles. Je sais que ces données étaient inconstent et je sais exactement comment faire face à cette incohérence. Je peux donc récupérer gracieusement. Je pense que je vais essayer d'utiliser sigsetjmp / siglongjmp fonctions POSIX et nous espérons qu'ils feront mieux en tant qu'exception. En effet, soit setjmp / longjmp ou sigsetjmp / siglongjmp sont utilisés pour mettre en œuvre des exceptions.

Oui, je débogués ma demande et voir que la pile d'appel est valide.

Était-ce utile?

La solution 3

Ok les gars,

Je l'ai fait avec sigsetjmp / siglongjmp. Fonctionne comme un charme. Je peux sauter par-dessus la fonction dans la pile de la fonction de l'appelant et faire erreur de manipulation il.

Merci pour toutes les suggestions.

Cordialement,

Ovanes

Autres conseils

Malheureusement, je n'ai pas de réponse pour le problème comme indiqué - Avez-vous essayé d'exécuter votre application sous un débogueur, pour voir exactement où il se termine

Cependant, une approche alternative qui est venu à mon esprit serait de mettre l'utilisation de la bibliothèque défectueuse dans un programme distinct, le lancer à partir de votre application et transmettre les données via un tuyau.

Cela peut être question stupide, mais doivent fichier de base examiné? Ou exécuter votre application dans le débogueur?

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top