CutePoison
CutePoison

Reputation: 141

breakpoint at end of a function

I am trying to log the input and output of a function via gdb script. below is a sample script.

set logging on
b func2
commands
silent
bt 1
continue
end
b func1
commands
silent
bt 1
set logging off
continue
end

It works fine and breakpoints at the specified functions, prints the backtrace and continues. is there a way to automatically set a breakpoint just before the called function returns to the calling function, so that I can just print output variables via gdb just after this "new" breakpoint. This will greatly simplify my debug, and help understand the function behavior for different calls in the code.

Any help is highly appreciated. Thanks a lot in advance !

Upvotes: 5

Views: 818

Answers (1)

jbcoe
jbcoe

Reputation: 3921

I have looked into this and cannot find a way to do this with normal GDB breakpoints.

It is possible to implement using the GDB Python extensions API.

source-ing a file with the following content (source FILENAME) from with GDB will allow one to issue the command break-return which will place a temporary break-point at every 'return' in the current file (this is overkill but works). Once any one of the breakpoints is hit they are all deleted.

import gdb

class _ReturnBreakpoint(gdb.Breakpoint):
    def stop(self):
        for breakpoint in self._siblings:
            if breakpoint.number != self.number:
                gdb.execute(f"d {breakpoint.number}")
        return True    

class _BreakReturn(gdb.Command):
    def __init__(self):
        super(_BreakReturn, self).__init__("break-return", gdb.COMMAND_USER)

    def invoke(self, arg, from_tty):
        function_name = gdb.selected_frame().name()
        source_file = gdb.selected_frame().find_sal().symtab.filename

        breakpoints = []
        with open(source_file) as o:
            for zero_based_index, line in enumerate(o.readlines()):
                if not 'return ' in line:
                    continue
                breakpoint = _ReturnBreakpoint(line=zero_based_index+1, temporary=True)
                breakpoints.append(breakpoint)

        for breakpoint in breakpoints:
            breakpoint._siblings = breakpoints

_BreakReturn()  # register the command with GDB

Taken from https://github.com/jbcoe/GDB-extensions/blob/master/extensions/break-return.py

Patches are welcome.

Upvotes: 3

Related Questions