tutorials.de Buch-Aktion 05/2012
ERLEDIGT
NEIN
ANTWORTEN
10
ZUGRIFFE
373
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    Avatar von MSVCplusplus
    MSVCplusplus MSVCplusplus ist offline Mitglied Brokat
    Registriert seit
    Dec 2010
    Ort
    Hessen
    Beiträge
    336
    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
    MfG
     
    Fehlermeldung bitte!
    Google - Dein Freund und Helfer

  2. #2
    Avatar von saftmeister
    saftmeister saftmeister ist offline Der Saft sei mit dir
    tutorials.de Premium-User
    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 ;-)

  3. #3
    Avatar von MSVCplusplus
    MSVCplusplus MSVCplusplus ist offline Mitglied Brokat
    Registriert seit
    Dec 2010
    Ort
    Hessen
    Beiträge
    336
    Danke
    Also vorgeshen erstmal für Windows XP aufwärts
     
    Fehlermeldung bitte!
    Google - Dein Freund und Helfer

  4. #4
    Avatar von saftmeister
    saftmeister saftmeister ist offline Der Saft sei mit dir
    tutorials.de Premium-User
    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 ;-)

  5. #5
    Avatar von MSVCplusplus
    MSVCplusplus MSVCplusplus ist offline Mitglied Brokat
    Registriert seit
    Dec 2010
    Ort
    Hessen
    Beiträge
    336
    Also ich benutze den Compiler von VS. Habe die 2010 Professional
     
    Fehlermeldung bitte!
    Google - Dein Freund und Helfer

  6. #6
    Avatar von saftmeister
    saftmeister saftmeister ist offline Der Saft sei mit dir
    tutorials.de Premium-User
    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 ;-)

  7. #7
    deepthroat deepthroat ist offline Mitglied Diamant
    tutorials.de Premium-User
    Registriert seit
    Jun 2005
    Beiträge
    8.168
    Hi.

    Das funktioniert unter Windows nicht in der Form.
    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.
    Siehe z.B. http://www.codeproject.com/KB/debug/...ReportPt4.aspx (und die anderen Teile)

    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.

  8. #8
    Avatar von saftmeister
    saftmeister saftmeister ist offline Der Saft sei mit dir
    tutorials.de Premium-User
    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 ;-)

  9. #9
    deepthroat deepthroat ist offline Mitglied Diamant
    tutorials.de Premium-User
    Registriert seit
    Jun 2005
    Beiträge
    8.168
    Zitat Zitat von saftmeister Beitrag anzeigen
    Hmm, danke für den Hinweis, aber mein Code oben verursacht definitiv ein SIGSEGV. Hast du eine Erklärung dafür?
    Ja, aber der Signalhandler wird nicht aufgerufen, oder doch?
     
    If at first you don't succeed, try again. Then quit. No use being a damn fool about it.

  10. #10
    Avatar von saftmeister
    saftmeister saftmeister ist offline Der Saft sei mit dir
    tutorials.de Premium-User
    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 ;-)

  11. #11
    deepthroat deepthroat ist offline Mitglied Diamant
    tutorials.de Premium-User
    Registriert seit
    Jun 2005
    Beiträge
    8.168
    Zitat Zitat von saftmeister Beitrag anzeigen
    Wird er. Jedenfalls habe ich das gestern so getestet.
    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

  1. Antworten: 12
    Letzter Beitrag: 09.08.10, 11:36
  2. In PHP eine JS-Funktion aufrufen
    Von chuvak im Forum PHP
    Antworten: 6
    Letzter Beitrag: 26.04.08, 17:10
  3. mit enter eine funktion aufrufen
    Von CryingBaby im Forum Javascript & Ajax
    Antworten: 2
    Letzter Beitrag: 17.07.06, 15:25
  4. In onEnterFrame eine Funktion aufrufen
    Von Orphelina im Forum Flash Plattform
    Antworten: 16
    Letzter Beitrag: 21.11.05, 14:43
  5. [MX] Eine Funktion von aussen aufrufen
    Von alma im Forum Flash Plattform
    Antworten: 13
    Letzter Beitrag: 24.08.03, 16:22