Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to assign a value returned from a function to a variable in GDB script?

Tags:

debugging

gdb

For example, consider the following debugging session:

(gdb) break foo
Breakpoint 1 at 0x4004f1: file tst.c, line 5.

(gdb) run
Starting program: /tmp/tst 
Breakpoint 1, foo () at tst.c:5
5         return ary[i++];

(gdb) finish
Run till exit from #0  foo () at tst.c:5
Value returned is $1 = 1

(gdb) cont
Continuing.
Breakpoint 1, foo () at tst.c:5
5         return ary[i++];

(gdb) finish
Run till exit from #0  foo () at tst.c:5
Value returned is $2 = 3

After executing a finish command, I get the return value assigned to a convenience variable (e.g. $1 or $2). Unfortunately, every time the command is executed, the value is assigned to a different variable. That's the problem, I cannot write a script which examines the returned value cause I don't know what variable the value was assigned to.

Why do I need that? I want to set a breakpoint at a certain function but to stop program execution only if the function has returned a specific value. Something like this:

break foo
commands
  finish
  if ($return_value != 42)
    continue;
  end
end

So the question is: Is there any way to examine in a script the value returned from a function?

like image 886
Nikolai Avatar asked Feb 01 '26 12:02

Nikolai


1 Answers

This isn't easy to do from the gdb CLI. Maybe it is impossible purely using the traditional CLI -- because you can have inferior control commands like finish in a breakpoint's commands. This is a longstanding gdb issue.

However, like most automation problems in gdb, it can be solved using the Python API. Now, unfortunately, this approach requires a bit of work on your part.

Essentially what you want to do is subclass the Python FinishBreakpoint class to have it do what you want. In particular you want to write a new command that will set a regular breakpoint in some function; then when this breakpoint is hit, it will instantiate your new FinishBreakpoint class. Your class will have a stop method that will use the return_value of the finish breakpoint as you like.

like image 146
Tom Tromey Avatar answered Feb 04 '26 00:02

Tom Tromey



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!