unit-testingscriptinggdbopenocdgdb-python

How to script gdb (with python)? Example add breakpoints, run, what breakpoint did we hit?


I'm trying to create a little unit test with gdb, for a embedded mcu that is controlled by OpenOCD (that gives me control over my target via a gdb server).

So I would like to automate this with some scripting of gdb.

I would like to write some kind of script for gdb that more or less does this:

  1. Add a couple of breakpoints
  2. Start the program
  3. When we stop, where did it stop (get the frame info)
  4. Quit.

Any ideas?

A example on how to do this in python gdb scripting would be nice.

Thanks Johan


Note:

Let's say that we have this basic structure, that more or less goes into test_failed() or test_success() depending on what the function start_test() returns.

void test_failed() {    
    while(1);    
}

void test_success() {    
    while(1);    
}

int main(void) {    
    int status = start_test();    

    if( status > 0 ) {    
        test_failed();    
    }    
    test_success();

    while(1);    
}

To do this manually in gdb is very strait forward,

(gdb) break test_success
Breakpoint 1 at 0x20: file src/main.c, line 9.
(gdb) break test_failed
Breakpoint 2 at 0x18: file src/main.c, line 5.
(gdb) cont
Continuing.

Breakpoint 1, test_success () at src/main.c:9
9       while(1);
(gdb) frame
#0  test_success () at src/main.c:9
9       while(1);
(gdb) 

So the next step I tried was to add those gdb commands into a gdb startup script that more or less just looked like this.

break test_success
break test_failed
target remote localhost:3333
cont 
frame

and start it with

arm-none-eabi-gdb --batch --command=commands.gdb main.elf

And this kind of works, but it is not very nice. How do I do this with the "new and cool" python scripts, that gdb seem to support.


Solution

  • FYI recent gdb versions are scriptable in Python. You can call python code from the gdb command line. This opens a whole new world, check the relevant documentation. From the command line run:

     dnf/yum/apt-get install gdb-doc
     info gdb extending python
    

    If you do not like the text-based info browser, here is one (among many?) alternative, graphical browser:

    yelp 'info:gdb' # , go to "Extending"
    

    Here is a sample gdb-python script. It attaches gdb to the first "your_program" found running.

    #!/usr/bin/python
    
    import subprocess
    import string
    
    def backquotes(cmdwords):
            output = subprocess.Popen(cmdwords, stdout=subprocess.PIPE).communicate()[0]
            return output.strip()
    
    pid = backquotes(['pgrep', 'your_program'])
    
    gdb.execute("attach " + str(pid))