Frage

Wir sind ein tragbares Code produzieren (win + MacOs) und wir betrachten, wie der Code mehr rubust zu machen, wie es jeder so oft ... (überläuft oder schlecht Initialisierungen in der Regel) stürzt ab: - (

Ich las, dass Google Chrome einen Prozess für jede Registerkarte verwendet also, wenn etwas schief geht, dann geht das Programm nicht compleatelly nicht abstürzen, nur dass die Registerkarte. Ich denke, dass ganz ordentlich ist, so könnte ich es gehen!

Also ich frage mich, ob jemand ein paar Tipps hat, helfen, die Liste zu lesen, kommentieren, oder etwas, das mir mehr rubust c bauen helfen kann ++ Code (tragbar ist immer besser).

Im selben Thema wurde ich auch gefragt, ob es eine Bibliothek für portable Prozesse (wie Boost)?

Nun Vielen Dank.

War es hilfreich?

Lösung

ich entwickelt habe auf zahlreiche Multi-Plattform C ++ Anwendungen (die größten sind 1.5M Codezeilen und läuft auf 7 Plattformen - AIX, HP-UX PA-RISC, HP-UX Itanium, Solaris, Linux, Windows, OS X). Sie haben tatsächlich zwei völlig verschiedene Probleme in Ihrem Beitrag.

  1. Instabilitäten. Der Code ist nicht stabil. Repariere es.

    • Verwenden Sie Unit-Tests Logik Probleme zu finden, bevor sie dich töten.
    • Verwenden Sie Debugger, um herauszufinden, was die Abstürze verursacht, wenn es nicht offensichtlich ist.
    • Verwenden Sie Boost- und ähnliche Bibliotheken. Insbesondere werden die Zeigertypen helfen Sie Speicherlecks zu vermeiden.
  2. Cross-Plattform-Codierung.

    • Auch hier verwenden Bibliotheken, die für diese, wenn möglich ausgelegt sind. Besonders für alle GUI-Bits.
    • Verwenden Standards (z ANSI vs gcc / MSVC, POSIX-Threads vs Unix-spezifischen Thread-Modellen, etc.) so weit wie möglich, auch wenn es ein bisschen mehr Arbeit erfordert. Reduzieren der plattformspezifischen Code bedeutet insgesamt weniger Arbeit und weniger APIs zu erfahren.
    • Isolieren, Isolieren, isolieren. Vermeiden Sie in-line #ifdefs für verschiedene Plattformen, so viel wie möglich. Stattdessen bleibt plattformspezifischen Code in die eigenen Kopf- / Quelle / Klasse und verwenden Sie Ihr Build-System und #includes den richtigen Code zu erhalten. Dies hilft, den Code sauber und gut lesbar.
    • Verwenden Sie den Integer-C99-Typen, wenn überhaupt möglich, anstelle von „long“, „int“, „short“, etc. - sonst wird es dir beißen, wenn Sie von einer 32-Bit-Plattform zu einem 64-Bit bewegen ein und longs plötzlich von 4 Byte auf 8 Byte ändern. Und wenn das immer auf das Netzwerk / die Festplatte geschrieben / etc dann werden Sie in Inkompatibilität zwischen Plattformen laufen.

Persönlich würde ich den Code stabilisieren erste (ohne weitere Funktionen hinzukommen) und dann mit den plattformübergreifenden Themen befassen, aber das ist bis zu Ihnen. Beachten Sie, dass Visual Studio verfügt über einen ausgezeichneten Debugger (den Basiscode oben erwähnt wurde auf Windows portiert gerade deshalb).

Andere Tipps

Die Chrome Antwort ist mehr über das Scheitern Minderung und nicht über die Qualität des Codes. Tun, was Chrome tut Niederlage einzugestehen.

  1. Bessere QA, die mehr als nur ist Programmierer ihre eigene Arbeit zu testen.
  2. Unit-Tests
  3. Regressionstests
  4. auf Best Practices Informieren Sie sich, dass andere Unternehmen nutzen.

stumpf sein, wenn Sie Ihre Software wird oft wegen Überflutung und schlechte Initialisierungen abstürzt, dann haben Sie ein sehr einfaches Programmierung Qualitätsproblem, das nicht leicht zu beheben sein wird. Das klingt ein Hash und bedeutet, dass nicht meine Absicht ist. Mein Punkt ist, dass das Problem mit dem schlechten Code hat das primäres Anliegen sein (was ich bin sicher, es ist). Dinge wie Chrome oder reichlicher Gebrauch zu Ausnahmebehandlung Programmfehler zu fangen sind Sie nur von dem eigentlichen Problem abzulenken.

Sie erwähnen nicht, was das Zielprojekt ist; bedeutet ein Verfahren pro-Lasche gar nicht unbedingt mehr „robust“ Code. Sie sollten mit Tests unabhängig von Portabilität festen Code schreiben wollen - lesen Sie einfach über das Schreiben gute C ++ Code:)

Wie für die Portabilität Abschnitt, stellen Sie sicher, dass Sie auf beiden Plattformen testen vom ersten Tag an und stellen Sie sicher, dass kein neuer Code geschrieben wird, bis plattformspezifische Probleme gelöst sind.

Sie wirklich, wirklich nicht wollen, zu tun, was Chrome tut, es erfordert einen Prozess-Manager, der für wahrscheinlich WAY Overkill ist das, was Sie wollen.

Sie sollten mit Smart-Pointer von Boost-oder einem anderen Werkzeug untersuchen, die Referenzzählung oder Garbage-Collection für C ++ bieten wird.

Alternativ, wenn Sie werden häufig abstürzt Sie vielleicht wollen vielleicht prüfen Nichterfüllung kritische Teile Ihrer Anwendung in einer Skriptsprache zu schreiben, die C ++ Bindungen hat.

Scott Meyers' Effective C ++ und More Effective C ++ ist sehr gut, und Spaß zu lesen.

Steve McConnell Code Complete ist ein Liebling vieler, darunter Jeff Atwood.

Die Boost-Bibliotheken sind wahrscheinlich eine ausgezeichnete Wahl. Ein Projekt, wo ich verwendet sie arbeiten. Ich habe nur verwendet WIN32 mich Threading.

Ich bin mit Torlack.

Bad Initialisierung oder Überläufe sind Zeichen von schlechter Qualität Code.

Google tat es so, weil manchmal, es gibt keine Möglichkeit, den Code zu steuern, die auf einer Seite (wegen der fehlerhaften Plugins, etc.) durchgeführt wurde. Wenn Sie also minderwertigen Plug-in verwenden (es passiert), wird vielleicht die Google-Lösung für Sie gut sein.

Aber ein Programm ohne Plugins, die oft abstürzt ist nur schlecht geschrieben, oder sehr, sehr komplex oder sehr alt (und viel Wartungszeit fehlt). Sie müssen die Entwicklung stoppen, und jede und jeden Absturz untersuchen. Unter Windows kompilieren, die Module mit PDBs (Programm-Datenbanken), und jedes Mal, es stürzt ab, fügen Sie einen Debugger es.

Sie müssen interne Tests hinzufügen, auch. Vermeiden Sie das Muster:

doSomethingBad(T * t)
{
   if(t == NULL) return ;

   // do the processing.
}

Das ist sehr schlechtes Design, da der Fehler ist, und Sie es nur vermeiden, diesmal . Aber die nächste Funktion ohne diese Wache wird abstürzen. Besser früher zum Absturz zu bringen näher von dem Fehler zu sein.

Stattdessen unter Windows (es muss eine ähnliche API auf MacOS sein)

doSomethingBad(T * t)
{
   if(t == NULL) ::DebugBreak() ; // it will call the debugger

   // do the processing.
}

(Sie diesen Code nicht direkt verwenden ... Legen Sie es in ein definieren liefert es an einen Kunden zu vermeiden ...) Sie können die Fehler API wählen, die Sie (Ausnahmen, Debugbreak, behaupten, etc.) passt, aber es verwenden, um den Moment zu stoppen den Code kennt, etwas falsch ist.

Vermeiden Sie den C-API, wann immer möglich. Verwenden Sie C ++ Idiome (RAH, etc.) und Bibliotheken.

Etc ..

P. S .: Wenn Sie Ausnahmen verwenden (das ist eine gute Wahl), nicht versteckt sie in einem Fang. Sie werden nur Ihr Problem noch schlimmer machen, da der Fehler ist, aber das Programm wird versuchen, fortzusetzen und wird wahrscheinlich manchmal nach Absturz und korrupt alles, was es in der Zwischenzeit berührt.

Sie können jederzeit die Ausnahmebehandlung zu Ihrem Programm hinzufügen, diese Art von Fehlern zu fangen und sie zu ignorieren (obwohl die Details sind plattformspezifisch) ... aber das ist sehr viel ein zweischneidiges Schwert. Stattdessen betrachtet das Programm die Ausnahmen abfangen und mit Dump-Dateien für die Analyse erstellen.

Wenn Ihr Programm auf unerwartete Weise verhalten hat, was wissen Sie über Ihren inneren Zustand? Vielleicht ist die Routine / Thread, der abgestürzt ist einige wichtige Datenstruktur beschädigt? wenn Sie vielleicht den Fehler abzufangen und versuchen, den Benutzer weiterhin speichern, was sie gerade arbeiten und die Korruption auf die Festplatte zu begehen?

Neben stabilen Code zu schreiben, hier ist eine Idee, die Ihre Frage beantwortet.

Ob Sie Prozesse oder Threads verwenden. Sie können ein kleines / einfaches Watchdog-Programm schreiben. Dann registrieren Sie Ihre anderen Programme mit dieser Watchdog. Wenn irgendein Prozeß stirbt oder ein Thread stirbt, kann es durch den Watchdog neu gestartet werden. Natürlich sollten Sie einige Test setzen in Sie den gleichen Buggy Thread Neustart nicht, um sicherzustellen, halten. dh: Neustart es 5 Mal, dann nach dem 5., shutdown das gesamte Programm und log / syslog-Datei

.

Erstellen Sie Ihre App mit Debug-Symbolen, dann entweder ein Exception-Handler hinzufügen oder Dr. Watson konfigurieren Crash-Dumps zu erzeugen (run drwtsn32.exe / i als Debugger zu installieren, ohne den / i den Config-Dialog zu öffnen). Wenn Ihre App abstürzt, können Sie prüfen, wo es schief ging in windbg oder Visual Studio durch eine Aufrufliste und Variablen zu sehen.

Google für Symbol-Server für weitere Informationen.

Natürlich können Sie die Ausnahmebehandlung verwenden, um es robuster zu machen und intelligente Zeiger verwenden, aber die Fehler zu beheben ist am besten.

Ich würde empfehlen, dass Sie eine Linux-Version zu kompilieren und führen Sie es unter Valgrind .

Valgrind Speicherlecks verfolgen wird, nicht initialisierten Speicher lesen und viele andere Codes Probleme. Ich empfehle es.

Nach über 15 Jahren Windows-Entwicklung Ich schrieb vor kurzem meine erste Cross-Plattform C ++ App (Windows / Linux). Hier ist, wie:

  • STL
  • kurbeln. Insbesondere das Dateisystem und Thread-Bibliotheken.
  • Eine Browser-basierte Benutzeroberfläche. Die App 'bedeutet' HTTP, mit der Benutzeroberfläche aus XHTML / CSS / JavaScript (Ajax-Stil). Diese Ressourcen werden in dem Server-Code eingebettet und an den Browser bedient, wenn erforderlich.
  • Reichliche Unit-Tests. Nicht ganz TDD, aber in der Nähe. Dies änderte sich tatsächlich so, wie ich entwickeln.

habe ich NetBeans C ++ für das Linux-Build und hatte ein komplett Linux-Port in kürzester Zeit alle.

Erstellen Sie es mit der Idee, dass der einzige Weg für das Programm zu beenden ist abstürzen und dass es jederzeit abstürzen können. Wenn Sie es auf diese Weise bauen, Krachen nie / verlieren fast nie irgendwelche Daten. Ich las einen Artikel über sie ein oder zwei Jahren. Leider habe ich keine Verbindung zu ihm haben.

Kombiniert man dies mit einer Art Crash-Dump und haben sie eine E-Mail Sie es so können Sie das Problem beheben.

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