ERLEDIGT
NEIN
NEIN
ANTWORTEN
10
10
ZUGRIFFE
373
373
EMPFEHLEN
-
04.12.11 11:27 #1
Hallo
Ich bin ja gar kein Freund von Speicherleaks
Deswegen wollte ich nun etwas in mein Programm einbauen, genauer gesagt ein Funktion, die IMMMER aufgerufen wird wenn das Programm endet. Auch wenn es abstürtzt. Ist sowas möglich?
Ich habe schon an assert gedacht, aber ich kenne die Funktionsweise nicht
Und Sry für den Dopelpost
MfGFehlermeldung bitte!
Google - Dein Freund und Helfer
-
04.12.11 11:34 #2
- Registriert seit
- May 2006
- Ort
- There is no place like 127.0.0.1
- Beiträge
- 3.516
Also assert() ist der genau falsche Weg, denn assert() löst im Zweifelsfall das Signal ABRT aus.
Für dein Vorhaben musst du einen sog. Signal-Handler implementieren. Damit würde die Frage aufkommen, für welches Betriebssystem deine Applikation vorgesehen ist.
Und was haben Speicherlecks damit zu tun?
assert ist dafür gedacht, den Zustand einer Variablen zu prüfen. Du kannst damit folgendes machen:
Code c:1 2 3 4
int main(int argc, char **argv) { assert(argc >= 2); // Prüfen, ob die Anzahl der Argument ans Programm mindestens 2 ist, ansonsten wird das Programm hier mit SIG_ABRT (Linux) terminiert. }
Grüße
--
Qualität des Codes wird in WTF's/Min gemessen: Je mehr, desto schlechter der Code ;-)
-
04.12.11 13:28 #3
Danke
Also vorgeshen erstmal für Windows XP aufwärts
Fehlermeldung bitte!
Google - Dein Freund und Helfer
-
04.12.11 13:35 #4
- Registriert seit
- May 2006
- Ort
- There is no place like 127.0.0.1
- Beiträge
- 3.516
Öhm, sorry, habe mich etwas unklar ausgedrückt, natürlich ist auch interessant, mit welchem Compiler das ganze erledigt werden soll. GCC benötigt anderes Coding als VS bspw.
Grüße
--
Qualität des Codes wird in WTF's/Min gemessen: Je mehr, desto schlechter der Code ;-)
-
04.12.11 13:50 #5
Also ich benutze den Compiler von VS. Habe die 2010 Professional
Fehlermeldung bitte!
Google - Dein Freund und Helfer
-
04.12.11 14:06 #6
- Registriert seit
- May 2006
- Ort
- There is no place like 127.0.0.1
- Beiträge
- 3.516
Hmm, ich sehe grad, das MS da sogar ein paar POSIX-Funktionen implementiert hat (das war nicht immer so):
http://msdn.microsoft.com/en-us/libr...=vs.71%29.aspx
Grundsätzlich funktioniert das so. Du registrierst einen Handler für das jeweilige Signal (z.B. SIGSEGV) und implementierst im Handler, was passieren soll, wenn dieses Signal auftritt. Im Falle von SIGSEGV ist z.b. eine Null-Pointer-Derefenzierung aufgetreten, man spricht auch von einem Segmentation Fault. Das sieht im Code dann so aus:
Code c:1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
#include <signal.h> #include <stdio.h> #include <malloc.h> #include <stdlib.h> // Signal-Handler für Segfaults void segfault_handler(int sig) { printf("Segmentation fault aufgetreten"); getchar(); // Hier könnte jetzt die Implementierung eines Stack-Trace-Dumps stehen exit(EXIT_FAILURE); } int main(int argc, char **argv) { void **p = NULL; signal(SIGSEGV, segfault_handler); free(*p); // Hier müsste der Segfault dann auftreten return 0; }
Grüße
--
Qualität des Codes wird in WTF's/Min gemessen: Je mehr, desto schlechter der Code ;-)
-
05.12.11 10:05 #7
- Registriert seit
- Jun 2005
- Beiträge
- 8.168
Hi.
Das funktioniert unter Windows nicht in der Form.
Siehe z.B. http://www.codeproject.com/KB/debug/...ReportPt4.aspx (und die anderen Teile)The SIGILL, SIGSEGV, and SIGTERM signals are not generated under Windows NT. They are included for ANSI compatibility. Thus you can set signal handlers for these signals with signal, and you can also explicitly generate these signals by calling raise.
oder http://code.google.com/p/crashrpt/
GrußIf at first you don't succeed, try again. Then quit. No use being a damn fool about it.
-
05.12.11 10:39 #8
- Registriert seit
- May 2006
- Ort
- There is no place like 127.0.0.1
- Beiträge
- 3.516
Hmm, danke für den Hinweis, aber mein Code oben verursacht definitiv ein SIGSEGV. Hast du eine Erklärung dafür?
Grüße
--
Qualität des Codes wird in WTF's/Min gemessen: Je mehr, desto schlechter der Code ;-)
-
05.12.11 10:40 #9
- Registriert seit
- Jun 2005
- Beiträge
- 8.168
If at first you don't succeed, try again. Then quit. No use being a damn fool about it.
-
05.12.11 10:46 #10
- Registriert seit
- May 2006
- Ort
- There is no place like 127.0.0.1
- Beiträge
- 3.516
Wird er. Jedenfalls habe ich das gestern so getestet.
Grüße
--
Qualität des Codes wird in WTF's/Min gemessen: Je mehr, desto schlechter der Code ;-)
-
05.12.11 10:59 #11
- Registriert seit
- Jun 2005
- Beiträge
- 8.168
Die Aussage das die Signale nicht generiert werden gilt offenbar für Visual Studio 2003 (dein Link) (und vermutlich alle vorigen Versionen).
Ab VS 2008 scheint dies nicht mehr der Fall zu sein, zumindest wird davon nichts mehr auf der MSDN Seite erwähnt (http://msdn.microsoft.com/en-us/libr...(v=VS.90).aspx)
Insofern war mir das neu, das man auf diese Signale unter Windows reagieren kann...
GrußIf at first you don't succeed, try again. Then quit. No use being a damn fool about it.
Ähnliche Themen
-
JFrame im Vordergrund, auch wenn hinten dran ein Programm im Fullscreen-Modus läuft.
Von Death Overlord im Forum JavaAntworten: 12Letzter Beitrag: 09.08.10, 11:36 -
In PHP eine JS-Funktion aufrufen
Von chuvak im Forum PHPAntworten: 6Letzter Beitrag: 26.04.08, 17:10 -
mit enter eine funktion aufrufen
Von CryingBaby im Forum Javascript & AjaxAntworten: 2Letzter Beitrag: 17.07.06, 15:25 -
In onEnterFrame eine Funktion aufrufen
Von Orphelina im Forum Flash PlattformAntworten: 16Letzter Beitrag: 21.11.05, 14:43 -
[MX] Eine Funktion von aussen aufrufen
Von alma im Forum Flash PlattformAntworten: 13Letzter Beitrag: 24.08.03, 16:22





Zitieren

Login






