Signale beim Debuggen

8

Ich entwickle eine Anwendung (ein Dienst / Daemon, wirklich) unter Linux in C ++, die mit einer Hardware verbunden werden muss. Wenn mein Programm die Ressourcen für diesen Teil der Hardware beim Beenden nicht sauber freigibt, dann muss ich den Gerätetreiber neu laden, ein Vorgang, der ungefähr 10 Minuten dauert und aus offensichtlichen Gründen zwischen jedem Test des Programms 10 Minuten warten muss frustrierend sein.

Also habe ich die sigaction() -Funktion benutzt, um ein SIGINT (ein ctrl-c) zu fangen, damit mein Programm sauber heruntergefahren werden kann, wenn ich damit fertig bin. Wenn das Programm von der Konsole aus ausgeführt wird, funktioniert das problemlos. Beim Debuggen in Netbeans oder Eclipse (ich habe beides versucht) funktionieren die Dinge jedoch nicht.

  • Wenn ich in Eclipse in der Konsole ctrl-c ankreuze, scheint es nicht zu registrieren, dass ein SIGINT jemals aufgetreten ist
  • Wenn ich in Eclipse das Programm im Debug-Modus laufe und dann kill -SIGINT <pid> verwende, bricht das Programm so ab, als würde es einen Haltepunkt treffen
  • Netbeans scheint tatsächlich zu erkennen, dass ein Signal gesendet wurde, als ich ctrl-c in der Konsole anklickte, und öffnete ein Dialogfeld mit der Frage, ob ich es an die Anwendung weiterleiten möchte. Ein Klick auf "Forward and continue" scheint das Programm zu unterbrechen und das Signal wird von der Anwendung nicht empfangen. Es sagt auch, dass ich dieses Zeug in Debug konfigurieren kann - & gt; Dbx configure, ein Menüpunkt, der nicht existiert
  • Wenn ich in Netbeans das Programm im Debug-Modus starte und dann kill -SIGINT <pid> verwende, verhält sich das Verhalten wie oben
  • Ich habe dann einen SIGQUIT-Handler hinzugefügt und versucht, das über kill beim Debuggen in Netbeans zu senden. Dieses Mal erscheint kein Dialog und der Signalhandler wird nie ausgelöst.

Ich brauche einige Wege, um meine App während des Debuggens sauber herunterzufahren. Irgendwelche Ideen?

    
Frederik 26.05.2011, 09:36
quelle

3 Antworten

7

Es stellt sich heraus, dass das Problem nichts mit Netbeans oder Eclipse zu tun hat, sondern mit gdb.

gdb kann so konfiguriert werden, dass Signale auf verschiedene Arten verarbeitet werden können. Wenn Sie Folgendes ausführen:

gdb

Geben Sie dann Folgendes ein:

info signals

Sie erhalten eine Liste von Signalen und gdb-Aktionen, was zu tun ist, wenn dieses Signal empfangen wird:

%Vor%

usw. ...

Meine temporäre Arbeit bestand darin, SIGALRM zu verwenden, das standardmäßig nicht bricht und an den Prozess sendet. Sie können die gdb-Standardeinstellungen jedoch auch anpassen, indem Sie eine .gdbinit-Datei erstellen, in der Sie diese festlegen können.

    
Frederik 27.06.2011, 11:12
quelle
6

Auch dieser Beitrag ist alt, ich hoffe, er kann anderen helfen.

Um zu verhindern, dass Eclipse Strg + C abfängt, können Sie Ihren gdb mit der Datei .gbdinit konfigurieren. Sie erstellen ein .gdinit mit diesem Inhalt

%Vor%

In Ihrer Eclipse-Konfiguration können Sie definieren, wo Ihre .gdbinit-Datei in Ihrer Debug-Konfiguration verwendet werden soll

    
lgm42 22.01.2015 08:50
quelle
2

Einfache Lösung .. Verwenden Sie DEBUG-Makros, um mit Ihrer Situation umzugehen.

%Vor%

Sie können auch versuchen, Ihre App vor dem Beenden zu bereinigen.

    
Ashwin 26.05.2011 11:19
quelle

Tags und Links