2010-08-14 6 views
15

Ich benutze GDB zum ersten Mal. Ich betreibeWie halte ich das Fortfahren in GDB

$ gdb 

dann

Ich bin mit
attach <mypid> 

dann sehe ich, dass mein Verfahren hängen geblieben ist (was wahrscheinlich ist ok). Jetzt möchte ich es weiter ausgeführt, so dass ich laufen

continue 

und mein Prozess wird fortgesetzt läuft, aber von hier ich bin stecken, wenn ich wieder möchte meine aktuelle Stack-Trace sehen usw. ich nicht raus konnte weiter ... Ich habe versucht Ctrl - D usw. aber nichts hat für mich funktioniert ... (war nur eine Vermutung).

+0

Ctrl-c sollte funktionieren. –

+0

ich versuchte auch CTRL-C tat es nicht – Jas

+0

Was meinst du mit stecken? Eine Endlosschleife? Siehe auch: http://stackoverflow.com/questions/8702658/gdb-how-do-i-pause-during-loop-execution –

Antwort

11

Sie sollten den von gdb angehängten Prozess unterbrechen. Unterbrechen Sie nicht gdb selbst. Unterbrechen Sie den Prozess entweder durch ctrl-c im Terminal in , mit dem der Prozess gestartet wurde, oder senden Sie den Prozess das SIGINT von kill-2 procid. Mit procid wird die ID des Prozesses angehängt.

+1

Schade, es gibt keine Möglichkeit, dies vom Host zu tun, wenn Sie gdbserver/client verwenden. – barkside

+0

Nicht das Offensichtliche angeben, aber es funktioniert nur, wenn das Programm nicht mit SIGINT arbeitet. Wenn es in main() oder einigen init() eine sigaddset-Raserei gibt ...;) – vesperto

4

Steuerung + C im GDB-Prozess sollte Sie zurück zur Eingabeaufforderung bringen.

+0

ctrl-c funktioniert nicht für mich bitte schauen: ' bash- 3.00 # gdb GNU gdb 6.8 Urheberrecht (C) 2008 Free Software Foundation, Inc. Lizenz GPLv3 +: GNU GPL Version 3 oder höher Dies ist freie Software: Sie können es ändern und neu verteilen. Es gibt KEINE GEWÄHRLEISTUNG, soweit gesetzlich zulässig. Geben Sie "show copying" und "show guarantee" für Details ein. Diese GDB wurde als "i386-pc-solaris2.10" konfiguriert. (GDB) befestigen 4305 Anbringen 4305 Retry # 1 zu verarbeiten: Retry # 2: ' – Jas

+0

 Retry #3: Retry #4: [New LWP 1] 0xfef298b5 in ??() (gdb) info frame Stack level 0, frame at 0x80477c8: eip = 0xfef298b5; saved eip 0xfef1b5d2 Arglist at 0x80477c0, args: Locals at 0x80477c0, Previous frame's sp is 0x80477c8 Saved registers: eip at 0x80477c4 (gdb) print The history is empty. (gdb) continue Continuing. ^D ^C quit ^C^C^C ^C 
Jas

+0

wie kann ich diese plz formatieren? Ich hatte dies in getrennten Zeilen, wie habe ich es auch in Kommentaren, was ich in getrennten Zeilen bitte eingefügt habe? – Jas

4

Hier ist eine kurze GDB tutorial, und hier ist eine full GDB manual.

Der Punkt des Debuggens ist es, interessante/verdächtige Teile des Programms zu inspizieren. Breakpoints können Sie die Ausführung an einem bestimmten Speicherort stoppen, und können Sie stoppen, wenn interessante Daten geändert werden.

Einfache Beispiele:

(gdb) break my_function 
(gdb) cont 

Dies wird einen Haltepunkt zu Beginn des my_function einzufügen, so dass, wenn die Ausführung des Programms gibt die Funktion das Programm gesperrt und Sie GDB prompt zurück, und der Lage sein, inspect program's state. Oder Sie können step über den Code.

(gdb) watch my_var 
(gdb) cont 

Gleiche, aber jetzt wird das Programm an gestoppt werden, was auch immer Position, die den Wert von my_var modifiziert.

Shameless Stecker - hier ist ein Link zu meinem GDB presentation bei NYC BSD User Group. Hoffe das hilft.

+0

aber ich wollte nur einen eigenen Zeitpunkt aussuchen und an diesem Punkt den Stack - Trace untersuchen ... und danach das Programm fortsetzen, ich wollte keine Breakpoints ... in meinem Fall will ich das untersuchen Stack-Trace des Programms zu einer eigenen Zeit. – Jas

+0

OK, was sagt "Infosignal" über 'SIGINT'? –

+0

@Jas was möglich ist es, ein laufendes Programm zufällig zu unterbrechen, um den Stack-Trace zu untersuchen? Alles, was Sie finden werden, ist, dass der Code, der derzeit auf dem Stapel ist, der Code ist, der ausgeführt wird. Normalerweise ist dies eine Schleife, die auf Benutzereingaben wartet. Hör mal. – theMayer