Frage

Im Moment habe ich ein Problem, das folgende Szenario Umsetzung die folgende Konfiguration verwenden:. GCC 3.4, Linux

Ich habe ein Werkzeug (in C ++) geschrieben, die Lasten eine gemeinsam genutzte Bibliothek (geschrieben in C). Diese Bibliothek hat einen Fehler, den ich nicht fix beeinflussen kann. Das Problem ist, dass es eine Eingabe liest und schreibt decodierte Ausgabe. Manchmal, wenn die Eingabe falsch ist, diese Bibliothek ohne Kontrollen zu tun beginnt Decodierung der folgenden Speicherbereiche. Das führt zu einer segfault.

Am Anfang war meine Idee, den Eingang in den ausgelagerten Speicher abgelegt werden soll (Linux mmap-syscall) und zu schützen (mprotect) die letzte Seite, vor dem Zugriff. Durch die Installation eines eigenen SIGSEGV Handler meines C ++ - App eine Ausnahme auslösen kann (wenn sie mit GCC Flagge -fnon-Call-Ausnahmen kompiliert). Diese Ausnahme wird die C lib Lesart unterbrechen. Ich bekannt, dass diese lib zuteilen keinen Speicher (oder andere Ressourcen), die während des Stapel Abwickeln verloren werden könnten. Das ganze Szenario funktionierte gut in meinen Unit-Tests, wo alles ein einzig C ++ App war. Aber jetzt, wenn der C-Code aus dem lib app meinem genannt wird beendet gerade ... Muß ich diese C-SO für den Wiederaufbau mit -fnon-Call-Ausnahmen Flagge als auch? Ich kann diese lib nicht kompiliert, sondern nur neu verknüpfen es, da ich den Zugriff auf obj haben nur Dateien.

Hier ist das Bild der Ausführungsumgebung:

+------------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             |
+-----------------------------+

Andere Vorschläge sind willkommen.

Vielen Dank,

Ovanes


P. S. Ich sehe einige Anregungen und Kritik, aber sie sind alle nicht optin. Hier ist der Grund: Ich habe nur eine Schnittstelle, wo ich in die Bibliothek verknüpfen. Die Bibliothek wird zu dekodieren Datenstrukturen verwendet. Das Problem ist, dass, wenn ich ein Array mit der Länge habe, die Bibliothek -1 beginnt das Array der Länge 0xFFFFFF (auf einem 32-Bit-System) zu dekodieren. Warten, bis die lib in einem separaten Prozess abstürzt, ist keine Option meiner Meinung nach. Zunächst einmal wird die Decodierung ein considarable ammount Zeit an einer Hand nehmen und viele Müll auf dem anderen produzieren. Da mein Werkzeug benötigt die decodierte Ausgabe zuverlässig an die Benutzer zu zeigen. Und sie müssen noch in der Lage sein, die Spuren zu verstehen.

Ich sehe nicht den Punkt hier eine SIGSEGV zu umgehen. Zunächst einmal liest die Bibliotheksdaten und schreibt sie in den Datei-Handle, das ich vor übergeben. Ich kann konfiguriert werden, wie in diesen Griff (gepuffert oder nicht) zu schreiben. Darüber hinaus weiß ich genau, dass es keine Heap-Daten oder Ressourcen zuteilt. Und schließlich wird versucht, den Zugriff auf Speicher, der meine app solche Fehler zu vermeiden geschützt. Aus der Perspektive des Benutzers kann ich nicht jemand sagen: Sorry, die binäre Spur war nur halb dekodierbar, da einige Daten inkonsistent waren. Ich weiß, dass diese Daten waren inconstent und ich genau weiß, wie man mit dieser Inkonsequenz beschäftigen. So kann ich elegant erholen. Ich glaube, ich versuchen, zu verwenden sigsetjmp / siglongjmp POSIX-Funktionen und hoffen, dass sie besser als Ausnahme tun wird. In der Tat entweder setjmp / longjmp oder sigsetjmp / siglongjmp werden verwendet, Ausnahmen zu implementieren.

Ja, gedebuggt ich meine Bewerbung und sehen, dass der Call-Stack gültig ist.

War es hilfreich?

Lösung 3

Ok Jungs,

Ich habe es mit sigsetjmp / siglongjmp. Klappt wunderbar. Ich kann die Funktion in den Stapel des Anrufers Funktion springen und tun Fehler dort Handhabung.

Vielen Dank für alle Vorschläge.

Mit freundlichen Grüßen

Ovanes

Andere Tipps

Leider wie gesagt ich habe keine Antwort für das Problem hat - haben Sie Ihre Anwendung unter einem Debugger versucht, ausgeführt wird, um zu sehen, wo genau endet es

Allerdings ein alternativer Ansatz, der mir in den Sinn kam, wäre die Verwendung der fehlerhaften Bibliothek in ein separates Programm zu setzen, starten Sie es von Ihrer Anwendung und geben sie die Daten über ein Rohr.

Dies könnte dumme Frage, aber zu untersuch Core-Datei hat? Oder führen Sie Ihre Anwendung in Debugger?

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top