2015-12-09 14 views
5

Ich versuche, einen Breakpoint auf die fünfte Zeile innerhalb einer Member-Funktion einer Klasse (eine Klasse, die ich erstellt habe) mit 'Gdb' setzen.einen Haltepunkt in einer bestimmten Zeile innerhalb einer Funktion mit 'Gdb' setzen

Von here ich verstanden, wie gerade am einen Haltepunkt setzen der die Funktion begining, aber ich will, es auf einem spezifischen Linie innerhalb der Funktion oder einen bestimmten Offset von Anfang an von diese Funktion.

Allgemein gibt es einen Weg in "gdb", um einen Haltepunkt zu einer Linie zu setzen, indem ich einen Abstand von einem anderen Haltepunkt setze, den ich bereits habe?

Danke!

Antwort

1

Es gibt keine Möglichkeit, einen Haltepunkt relativ zum Anfang einer Funktion so zu setzen, dass sie ihre relative Position bei einer Änderung der Quelldatei beibehält. Dies wäre manchmal nützlich; aber es ist nur eine Funktion, die niemand zu gdb hinzugefügt hat.

Es könnte vielleicht von Python emuliert werden, obwohl es nicht genau so funktionieren könnte, wie gewöhnliche Breakpoints funktionieren, weil Python keinen Zugriff auf den Breakpoint-Reset-Mechanismus in gdb hat.

Eine One-Shot-Lösung kann entweder wie in der anderen Antwort oder von Python gezeigt durchgeführt werden.

Wenn ich diese Art von Funktionalität benötigt habe - eine Breakpoint-Mid-Funktion, die einigermaßen robust gegenüber Quellenänderungen ist - habe ich statische "SDT" -Probepunkte verwendet. Mit diesen kannst du solche Spots in deiner Quelle benennen.

5

Sie können einen Haltepunkt an einem Versatz von der aktuellen angehaltenen Position mit gdb breakpoint +<offset> erstellen.

Sie können auch einen Haltepunkt für eine bestimmte Zeilennummer unter Verwendung von gdb break <linenumber> (für die aktuelle Quelldatei) oder gdb break <filename>:<linenumber> (für eine andere Datei als die aktuelle Datei) erstellen.

Weitere Details in der docs.

1
  1. info fun <function name> oder vollständig qualifizierte info functions <function name> bekommt Funktionen und deren Quelldateien
  2. list <function name>

Drucklinien um den Beginn der Funktion Funktion zentriert.

Listet den Quellcode aller Funktionen auf, mit etwas Code unten.

  1. Linie Wählen Sie
  2. break <filename:linenum>
0

Hier ist, wie Sie es mit Python-Skripte für GDB automatisieren:

class RelativeFunctionBreakpoint (gdb.Breakpoint): 
    def __init__(self, functionName, lineOffset): 
     super().__init__(RelativeFunctionBreakpoint.calculate(functionName, lineOffset)) 

    def calculate(functionName, lineOffset): 
     """ 
     Calculates an absolute breakpoint location (file:linenumber) 
     based on functionName and lineOffset 
     """ 
     # get info about the file and line number where the function is defined 
     info = gdb.execute("info line "+functionName, to_string=True) 
     # extract file name and line number 
     m = re.match(r'Line[^\d]+(\d+)[^"]+"([^"]+)', info) 
     if not m: 
      raise Exception('Failed to find function %s.' % functionName) 
     line = int(m.group(1))+lineOffset #add the lineOffset 
     fileName = m.group(2) 
     return "%s:%d" % (fileName, line) 

Grund Nutzung:

RelativeFunctionBreakpoint("yourFunctionName", lineOffset=5) 

Sie können auch einen benutzerdefinierten Haltepunkt schreiben. Mehr Infos hier: https://stackoverflow.com/a/46737659/5787022

Mit Python-Skript GDB

Verwandte Themen