Donnerstag, Mai 28, 2020

Signale beim Debuggen

Entwickle ich eine Anwendung (ein Dienst/daemon, wirklich) auf Linux in C++, muss die Schnittstelle mit einem Stück hardware. Wenn mein Programm nicht lassen Sie die Mittel für dieses Stück hardware sauber bei der Kündigung, dann muss ich neu laden der Gerätetreiber, ein Prozess, der dauert etwa 10 Minuten und aus offensichtlichen Gründen zu müssen, warten Sie 10 Minuten zwischen jeder test des Programms wäre frustrierend.

So, ich habe das sigaction() Funktion zum abfangen einer SIGINT (Strg-c), so dass mein Programm kann sauber Herunterfahren, wenn ich fertig bin mit ihm. Beim ausführen des Programms aus der Konsole, diese funktioniert einwandfrei. Allerdings, wenn das Debuggen in Netbeans oder Eclipse (ich habe beides ausprobiert) Dinge, die nicht funktionieren.

  • In Eclipse, wenn ich mit Strg-c in der Konsole, Sie bietet es scheint nicht zu registrieren, dass ein SIGINT jemals aufgetreten
  • In Eclipse, wenn ich das Programm im debug-Modus, und verwenden Sie dann kill -SIGINT <pid>, das Programm bricht als wenn es einen Haltepunkt erreicht
  • Netbeans scheint tatsächlich so zu realisieren, ein signal wurde gesendet, wenn ich mit Strg-c in der Konsole, und öffnet sich ein Dialogfenster gefragt, ob ich will leitet es an die Anwendung. Klick auf die „weiter und weiter“ scheint nur zu brechen, das Programm und das signal nicht empfangen wird, durch die Anwendung. Er sagt auch, ich kann konfigurieren dieses Zeug im Debug -> Dbx konfigurieren, ein Menüpunkt, der nicht existiert
  • In Netbeans, wenn ich das Programm im debug-Modus, und verwenden Sie dann kill -SIGINT <pid>, das Verhalten ist das gleiche wie oben
  • Ich dann noch ein SIGQUIT-handler und versucht, den Versand, die über kill beim Debuggen in Netbeans. Dieser Zeit, wird kein Dialogfeld angezeigt und die signal-handler wird nie ausgelöst.

Brauche ich einige Weg, um sauber Herunterfahren meine app während ich das Debuggen. Irgendwelche Ideen?

InformationsquelleAutor Frederik | 2011-05-26

3 Kommentare

  1. 7

    Es stellt sich heraus, das problem hatte nichts zu tun mit Netbeans oder Eclipse, sondern eher gdb.

    gdb kann konfiguriert werden, um den Umgang mit Signalen in eine Vielzahl von Möglichkeiten. Wenn Sie ausführen:

    gdb

    geben:

    info signals

    Erhalten Sie eine Liste der Signale und gdb-Aktionen, was zu tun ist, wenn er empfängt das signal:

    Signal        Stop      Print   Pass to program  Description
    
    SIGHUP        Yes       Yes     Yes              Hangup
    SIGINT        Yes       Yes     No               Interrupt
    SIGQUIT       Yes       Yes     Yes              Quit
    SIGILL        Yes       Yes     Yes              Illegal instruction
    SIGTRAP       Yes       Yes     No               Trace/breakpoint trap

    etc…

    Meine temporären arbeiten, um zu verwenden SIGALRM die gdb standardmäßig nicht brechen und senden an den Prozess. Sie können jedoch auch so anpassen, dass der Standard-gdb-Einstellungen durch erstellen einer .gdbinit-Datei, wo Sie können diese

    • Also, ist es möglich, gdb Griff SIGINT sinnvoll? Was wäre die .gdbinit Inhalt zu tun?
  2. 7

    Sogar dieser post ist alt, hoffe, es kann anderen helfen.

    Um zu verhindern, dass Eclipse-vom Fang über die Tastenkombination Strg+C können Sie Ihren gdb verwenden .gbdinit-Datei.
    Erstellen Sie eine .gdinit mit diesem Inhalt

    #we want Ctrl+C to be no break, pass to application and printed by the debugger 
    handle SIGINT nostop
    handle SIGINT pass
    handle SIGINT print

    In Ihrer eclipse-Konfiguration können Sie definieren, wo ist dein .gdbinit-Datei zu verwenden, die in Ihrem Debug-Konfiguration

    Signale beim Debuggen

  3. 2

    Einfache Lösung.. Versuchen Sie es mit DEBUG-Makros für die Abwicklung Ihrer situation.

    //Register the signal handler to stop service.
    #ifdef _DEBUG
            signal(SIGKILL, <your signal handler>);
    #endif

    Außerdem können Sie versuchen zu bereinigen Ihre app, bevor Sie verlassen.

    • Vielen Dank dafür, aber wie würde ich entscheiden, Wann die Anwendung beendet? Wenn ich nur diese auf das Ende meiner main () – block oder ähnliches den Dienst starten und stoppen sofort
    • Erklären, “ wie würde ich entscheiden, Wann die Anwendung beendet?‘ 🙂
    • Wie ich schon sagte, dies wird ein Dienst oder daemon. Manchmal werde ich testen müssen, die es nur für ein paar Sekunden, andere Male, die ich laufen müssen mehr umfangreiche tests. Der Punkt ist, ich kann nicht einfach sagen, dass der Schlaf für 15 Sekunden und dann ein signal senden, – ich muss in der Lage sein, um das Programm zu beenden, der zu einem Zeitpunkt meiner Wahl.
    • Ok… wie Sie erwähnen es ist ein daemon/service werden Sie kontinuierlich ausführen des Haupt-thread (oder Schleife). Wenn dies richtig ist, dann können Sie erzeugen ein signal, um Ihren Dienst zu „befreien die Ressourcen und beenden“. In solchen Fällen können Sie auch vermeiden, „Schlaf für 15 Sekunden und dann ein signal senden“. Diese eine wieder, nur mein Vorschlag. Nacharbeit auf Ihr design unter Berücksichtigung erforderlichen Strategien für Ihren daemon. 🙂

Kostenlose Online-Tests