error-reporting

___ answer3533513 ___

"Vorbelegten Heap-Speicher freigeben ...". Das war genau das, was ich dir beim Lesen deiner Frage dachte. Aber ich denke du kannst es versuchen. Jeder Prozess hat seinen eigenen virtuellen Speicherplatz. Bei anderen Prozessen, die viel Arbeitsspeicher belegen, funktioniert dies möglicherweise noch, wenn der gesamte Computer funktioniert.

    
___ qstnhdr ___ C ++ / Windows: Wie melde ich eine Out-of-memory-Ausnahme (bad_alloc)? ___ qstntxt ___

Ich arbeite zur Zeit an einem ausnahmebasierten Fehlermeldesystem für Windows MSVC ++ (9.0) -Apps (zB Ausnahmestrukturen & amp; types / Vererbung, Callstack, Fehlerreporting & amp; Logging usw.).
< br> Meine Frage ist jetzt: Wie man & amp; einen Fehler wegen zu wenig Arbeitsspeicher protokollieren?

Wenn dieser Fehler auftritt, z.B. Als ein %code% , das von %code% op geworfen wird, können viele "Features" nicht verfügbar sein, hauptsächlich was die weitere Speicherzuweisung betrifft. Normalerweise würde ich die Ausnahme an die Anwendung übergeben, wenn sie in eine Lib geworfen wurde, und dann Meldungsfelder und Fehlerprotokolldateien verwenden, um sie zu melden und zu protokollieren. Eine andere Möglichkeit (hauptsächlich für Dienste) ist die Verwendung des Windows-Ereignisprotokolls.
Das Hauptproblem, das ich habe, besteht darin, eine Fehlermeldung zu erstellen. Um einige Fehlerinformationen bereitzustellen, möchte ich eine statische Fehlermeldung definieren (kann ein String-Literal sein, besser ein Eintrag in einer Nachrichtendatei, dann FormatMessage verwenden) und einige Laufzeit-Informationen wie einen Aufruf-Stack einschließen > Die dafür notwendigen Funktionen / Methoden verwenden entweder

  • STL ( %code% )
  • CRT ( %code% )
  • oder Win32-API ( %code% )

Abgesehen davon, dass sie auf dem MSDN dokumentiert sind, haben alle von ihnen mehr (Win32) oder weniger (STL) in Windows geschlossen, so dass ich nicht wirklich weiß, wie sie sich unter Problemen mit wenig Arbeitsspeicher verhalten Nur um zu beweisen, dass es Probleme geben könnte, schrieb ich eine triviale kleine App, die ein bad_alloc provoziert:

%Vor%

Lief zwei Instanzen ohne Debugger angeschlossen (in Release config, VS 2008), aber "nichts ist passiert", d. h. keine Fehlercodes von ReportEvent oder WriteFile, die ich intern in der Fehlerberichterstattung verwendet habe. Anschließend wurde eine Instanz mit und ohne Debugger gestartet, und sie konnten versuchen, ihre Fehler nacheinander mithilfe eines Haltepunkts in der Zeile ReportError zu melden. Das funktionierte gut für die Instanz mit dem angehängten Debugger (korrekt gemeldet und den Fehler protokolliert, sogar mit LocalAlloc ohne Probleme)! Aber taskman zeigte ein merkwürdiges Verhalten, bei dem viel Speicher freigesetzt wurde, bevor die App beendet wurde. Ich vermute, wenn die Ausnahme ausgelöst wird.


Bitte beachten Sie, dass es mehr als einen Prozess [edit] und mehr als einen Thread [/ edit] gibt, die viel Speicher verbrauchen. Daher ist das Freigeben von zuvor zugewiesenem Heap-Speicher keine sichere Lösung, um eine Umgebung mit wenig Speicher für den Prozess zu vermeiden der Fehler.

Vielen Dank im Voraus!

    
___ tag123windows ___ ALLGEMEINER WINDOWS-SUPPORT IST OFF-TOPIC. Support-Fragen können unter https://superuser.com gestellt werden. Windows ist ein von Microsoft entwickeltes Betriebssystem. Verwenden Sie dieses Tag nur, wenn sich Ihre Frage auf die Verwendung von Windows-APIs oder Windows-spezifischem Verhalten in Bezug auf Ihren Code bezieht, nicht nur, weil Sie Ihren Code unter Windows ausführen. ___ answer3535520 ___

Sie können keine CRT- oder MessageBox-Funktionen zum Behandeln von OOM verwenden, da sie möglicherweise, wie Sie beschreiben, Speicher benötigen. Die einzige wirklich sichere Sache, die Sie tun können, ist, ein Stück Speicher beim Start zuzuweisen Sie können Informationen in eine Datei oder eine Pipe schreiben und öffnen, dann WriteFile darauf, wenn Sie OOM out.

    
___ tag123rorreporting ___ hilf uns dieses Wiki zu bearbeiten ___ tag123outofmemory ___ Ein Fehler oder eine Ausnahme, die ausgelöst wird, wenn ein Programm eine Anforderung für Speicher stellt, der nicht erfüllt werden kann. ___ tag123c ___ C ++ ist eine universelle Programmiersprache. Es wurde ursprünglich als Erweiterung von C entworfen und behält eine ähnliche Syntax, ist aber jetzt eine komplett andere Sprache. Verwenden Sie dieses Tag für Fragen zu Code, der mit einem C ++ - Compiler kompiliert werden soll. ___ answer3533748 ___
  

Beachten Sie, dass mehr als ein Prozess viel Arbeitsspeicher belegen kann. Daher ist das Freigeben von bereits zugewiesenem Heap-Speicher keine sichere Lösung, um eine Umgebung mit geringem Arbeitsspeicher für den Prozess zu vermeiden, der den Fehler melden möchte.

Unter Windows (und anderen modernen Betriebssystemen) hat jeder Prozess seinen eigenen Adressraum (auch Speicher genannt), der von jedem anderen laufenden Prozess getrennt ist. Und all das ist getrennt von dem wörtlichen RAM in der Maschine. Das Betriebssystem hat den Prozessadressraum vom physischen RAM entfernt virtualisiert.

Auf diese Weise kann Windows den von Prozessen verwendeten Speicher in die Auslagerungsdatei auf der Festplatte schieben, ohne dass diese Prozesse wissen, was passiert ist.

Dies ist auch, wie ein einzelner Prozess mehr Speicher reservieren kann, als der Rechner physischen RAM hat und trotzdem noch läuft. Zum Beispiel könnte ein Programm, das auf einer Maschine mit 512 MB RAM läuft, immer noch 1 GB Speicher reservieren. Windows könnte einfach nicht alles gleichzeitig im RAM behalten und ein Teil davon wäre in der Auslagerungsdatei. Aber das Programm würde es nicht wissen.

Wenn also ein Prozess Speicher zuweist, verursacht dies nicht, dass ein anderer Prozess weniger Arbeitsspeicher zur Verfügung hat. Jeder Prozess ist separat.

Jeder Prozess muss sich nur um sich selbst kümmern. Und so ist die Idee, einen vorher zugewiesenen Teil des Gedächtnisses zu befreien, tatsächlich sehr praktikabel.

    
___ answer3550960 ___
  • Reservieren Sie die benötigten Puffer
  • vor
  • verknüpfen Sie statisch und verwenden Sie _beginthreadex anstelle von CreateThread (andernfalls können CRT-Funktionen fehlschlagen) - ODER - implementieren Sie die Zeichenfolge concat / i2a selbst
  • MessageBox verwenden (MB_SYSTEMMODAL | MB_OK) MSDN erwähnt dies für das Melden von OOM-Bedingungen (und einige MS-Blogger beschrieben dieses Verhalten wie beabsichtigt: das Nachrichtenfeld weist keinen Speicher zu.)

Die Protokollierung ist schwieriger, zumindest muss die Protokolldatei bereits geöffnet sein.

Wahrscheinlich am besten mit %code% und %code% , um Pufferversuche zu vermeiden. Die erste erfordert, dass Schreibvorgänge und Ihre Speicherpuffer Sektoren-ausgerichtet sind (dh Sie müssen GetDiskFreeSpace abfragen, Ihren Puffer darauf ausrichten und nur auf "mehrere Sektorengrößen" -Dateioffsets und in Blöcke schreiben, die Vielfache der Sektorgröße sind. Ich bin mir nicht sicher, ob dies notwendig ist oder hilft, aber eine systemweite OOM, bei der jede Zuweisung fehlschlägt, ist schwer zu simulieren.

    
___
4
Antworten

PHP kann keine Fehler melden

Ich kann keine PHP-Fehler sehen. Ich habe jeden Trick ausprobiert, den ich finden kann, um Fehlerberichte zu aktivieren, aber nichts funktioniert. display_errors ist aktiviert und error_logging ist aktiviert, aber wenn ich eine Seite mit eine...
30.08.2010, 23:02
1
Antwort

php Fehlerbericht Nicht initialisierter String-Offset: 0

Ich mache ein Zeug in PHP und nicht im Debug-Modus. Also ich bin uns %Vor% aber wenn ich versuche, auf irgendein Zeichen von Zeichenkette zuzugreifen, gibt es mir Fehler wegen der Fehlermeldung. %Vor% bearbeitet: %Vor% Wie sollte ich...
04.02.2012, 05:31
6
Antworten

Was ist der beste Weg, um Anwendungsfehler und Protokolle per Internet an die Entwickler zu senden?

Als Autor einer C # -Anwendung habe ich festgestellt, dass die von Benutzern gemeldeten Probleme bei der Fehlerbehebung viel leichter sind, wenn ich auf die Ausnahmebestätigungen oder Debug-Protokolle zugreifen konnte. Ich habe einen selbst e...
24.05.2009, 02:59
6
Antworten

Wie implementiere ich am besten einfache Crash- / Fehlerberichte?

Was wäre der beste Weg, um einen einfachen Crash- / Fehlermeldungsmechanismus zu implementieren? Details: Meine App ist plattformübergreifend (mac / windows / linux) und in Python geschrieben , also brauche ich nur etwas, das mir eine kleine...
17.09.2008, 18:09
4
Antworten

C ++ / Windows: Wie melde ich eine Out-of-memory-Ausnahme (bad_alloc)?

Ich arbeite zur Zeit an einem ausnahmebasierten Fehlermeldesystem für Windows MSVC ++ (9.0) -Apps (zB Ausnahmestrukturen & amp; types / Vererbung, Callstack, Fehlerreporting & amp; Logging usw.). < br> Meine Frage ist jetzt: Wie man & amp; eine...
20.08.2010, 17:40