How to do an specific action when a certain breakpoint is hit in GDB?

后端 未结 3 1983
被撕碎了的回忆
被撕碎了的回忆 2020-12-02 15:34

I am looking for a way to do some action when a particular break point hits in gdb.

Basically I have some memleak in my program. When malloc and free function hits,

相关标签:
3条回答
  • 2020-12-02 15:56

    For example, here is how you could use breakpoint commands to print the value of x at entry to foo whenever x is positive.

    break foo if x>0
    commands
    silent
    printf "x is %d\n",x
    cont
    end
    

    If the first command you specify in a command list is silent, the usual message about stopping at a breakpoint is not printed. This may be desirable for breakpoints that are to print a specific message and then continue. If none of the remaining commands print anything, you see no sign that the breakpoint was reached. silent is meaningful only at the beginning of a breakpoint command list.

    One application for breakpoint commands is to compensate for one bug so you can test for another. Put a breakpoint just after the erroneous line of code, give it a condition to detect the case in which something erroneous has been done, and give it commands to assign correct values to any variables that need them. End with the continue command so that your program does not stop, and start with the silent command so that no output is produced. Here is an example:

    break 403
    commands
    silent
    set x = y + 4
    cont
    end
    
    0 讨论(0)
  • 2020-12-02 15:57

    To clarify Fredrik's answer, commands (or just command, it seems) automatically knows you just set a breakpoint. That is, what Fredrik is showing isn't a multi-line break command, it's two separate commands: break, and commands. It looks like this:

    (gdb) break 989 
    Breakpoint 23 at 0x7fffe2761dac: file foo.cpp, line 989.
    (gdb) command
    Type commands for breakpoint(s) 23, one per line.
    End with a line saying just "end".
    >silent
    >print result
    >end
    (gdb) c
    Continuing.
    $79 = {elems = {0, 0}}
    (gdb) 
    
    0 讨论(0)
  • 2020-12-02 16:02

    dprintf (Dynamic printf)

    https://sourceware.org/gdb/onlinedocs/gdb/Dynamic-Printf.html

    This is the most convenient solution for the specific case of printing things:

    dprintf <line>, "%u\n", variable
    

    It could also be faster than commands as it could compile and inject code, instead of giving control back to GDB to interpret arbitrary command strings, which is extremely slow. TODO I don't know if this is actually done. dprintf vs commands: What is the difference between dprintf vs break + commands + continue?

    Detailed example:

    main.c

    #include <inttypes.h>
    #include <stdint.h>
    #include <stdio.h>
    #include <stdlib.h>
    
    int main(void) {
        uint32_t i;
        uint32_t r = 0;
        for (i = 0; i < 10; ++i) {
            r += i*i + 13*r*i + 17;   /* LINE 10. */
        }
        printf("%" PRIu32 "\n", r);
        return EXIT_SUCCESS;
    }
    

    Then:

    gcc -ggdb3 -O0 -std=c99 -o main main.c
    gdb -batch -nh -q -ex 'dprintf 10, "%u %u\n", i, r' -ex 'run' ./main
    

    Output:

    Dprintf 1 at 0x400545: file main.c, line 10.
    0 0
    1 17
    2 256
    3 6933
    4 277346
    5 14699371
    6 970158528
    7 3628079733
    8 3070853710
    9 317092431
    3057168588
    [Inferior 1 (process 14305) exited normally]
    

    Tested in Ubuntu 16.04, GDB 8.2.

    0 讨论(0)
提交回复
热议问题