How to break when a specific exception type is thrown in GDB?

后端 未结 9 1195
迷失自我
迷失自我 2020-12-02 07:40

According to the documentation I can break on specific exception type by using conditional breakpoints. However the syntax for the condition isn\'t very clear to me:

9条回答
  •  时光说笑
    2020-12-02 08:02

    I think I can answer the part about setting conditional breaks. I won't answer question regarding exceptions as __raise_exception seems to not exist in g++ 4.5.2 (?)

    Let's assume that you have following code (I use void to get something similar to __raise_exception from gdb doc)

    void foo(void* x) {
    
    }
    
    int main() {
        foo((void*)1);
        foo((void*)2);
    }
    

    to break at foo(2) you use following commands

    (gdb) break foo
    Breakpoint 1 at 0x804851c: file q.cpp, line 20.
    (gdb) condition 1 x == 2
    

    If you run with

    (gdb) r
    

    you will see that it stops on the second foo call, but not on the first one

    I think, what they meant in docs is that you set break on function __raise_exception (very implementation dependent)

     /* addr is where the exception identifier is stored
        id is the exception identifier.  */
        void __raise_exception (void **addr, void *id);
    

    and then set conditional break on id as described above (you have to somehow determine what is id for yours exception type).

    Unfortunately

     (gdb) break __raise_exception
    

    results with (g++ 4.5.2)

     Function "__raise_exception" not defined.
    

提交回复
热议问题