如何在GDB中抛出特定的异常类型时中断?

Sta*_*ked 51 c++ gdb

根据文档,我可以通过使用条件断点来打破特定的异常类型.但是条件的语法对我来说不是很清楚:

condition bnum <expression>
Run Code Online (Sandbox Code Playgroud)

看一下表达式语法,我认为这是我需要的模式:

{type} addr

但是,我不知道我应该为addr论证传递什么.我尝试了以下方法:

(gdb) catch throw
(gdb) condition 1 boost::bad_function_call *
Run Code Online (Sandbox Code Playgroud)

但它不起作用(gdb中断所有异常类型).

有人可以帮忙吗?


更新

我也试过了@ Adam的建议,但它会导致错误信息:

(gdb) catch throw boost::bad_function_call
Junk at end of arguments.
Run Code Online (Sandbox Code Playgroud)

没有boost::名称空间

(gdb) catch throw bad_function_call
Junk at end of arguments.
Run Code Online (Sandbox Code Playgroud)


解决方法

打破bad_function_call作品的构造.

Ada*_*eld 22

编辑

文档表明,catch throw <exceptname>只要<exceptname>抛出类型异常,就可以用它来破解; 然而,这似乎在实践中不起作用.

(gdb) help catch
Set catchpoints to catch events.
Raised signals may be caught:
        catch signal              - all signals
        catch signal <signame>    - a particular signal
Raised exceptions may be caught:
        catch throw               - all exceptions, when thrown
        catch throw <exceptname>  - a particular exception, when thrown
        catch catch               - all exceptions, when caught
        catch catch <exceptname>  - a particular exception, when caught
Thread or process events may be caught:
        catch thread_start        - any threads, just after creation
        catch thread_exit         - any threads, just before expiration
        catch thread_join         - any threads, just after joins
Process events may be caught:
        catch start               - any processes, just after creation
        catch exit                - any processes, just before expiration
        catch fork                - calls to fork()
        catch vfork               - calls to vfork()
        catch exec                - calls to exec()
Dynamically-linked library events may be caught:
        catch load                - loads of any library
        catch load <libname>      - loads of a particular library
        catch unload              - unloads of any library
        catch unload <libname>    - unloads of a particular library
The act of your program's execution stopping may also be caught:
        catch stop

C++ exceptions may be caught:
        catch throw               - all exceptions, when thrown
        catch catch               - all exceptions, when caught
Ada exceptions may be caught:
        catch exception           - all exceptions, when raised
        catch exception <name>    - a particular exception, when raised
        catch exception unhandled - all unhandled exceptions, when raised
        catch assert              - all failed assertions, when raised

Do "help set follow-fork-mode" for info on debugging your program
after a fork or vfork is caught.

Do "help breakpoints" for info on other commands dealing with breakpoints.
Run Code Online (Sandbox Code Playgroud)

  • 使用`catch throw <exceptname>`会导致错误消息"参数结束时的垃圾邮件". (3认同)

Fra*_*ois 17

当gdb命令'catch throw'失败时,请尝试以下解决方法:(
使用Linux g ++ 4.4.5/gdb 6.6测试)
1 /在程序中的任何位置添加此代码以进行调试:

#include <stdexcept>
#include <exception>
#include <typeinfo>

struct __cxa_exception {
    std::type_info *inf;
};
struct __cxa_eh_globals {
    __cxa_exception *exc;
};
extern "C" __cxa_eh_globals* __cxa_get_globals();
const char* what_exc() {
    __cxa_eh_globals* eh = __cxa_get_globals();
    if (eh && eh->exc && eh->exc->inf)
        return eh->exc->inf->name();
    return NULL;
}
Run Code Online (Sandbox Code Playgroud)

2 /在gdb中,您将能够使用以下内容过滤异常:

(gdb) break __cxa_begin_catch  
(gdb) cond N (what_exc()?strstr(what_exc(),"exception_name"):0!=0)  
Run Code Online (Sandbox Code Playgroud)

其中N是断点号,exception_name是我们希望中断的异常的名称.


Ϲοδ*_*διϲ 13

根据我从这里的问题中理解,您希望boost::bad_function_call在应用程序中抛出特定异常时中断.

$> gdb /path/to/binary
(gdb) break boost::bad_function_call::bad_function_call()
(gdb) run --some-cli-options
Run Code Online (Sandbox Code Playgroud)

所以临时对象boost::bad_function_call的构建是为了准备throw; gdb会爆发!

我测试了这个,它确实有效.如果你准确地知道构造异常对象的方式,那么你可以在特定的构造函数上设置断点,否则如下面的例子所示,你可以省略参数原型列表,并gdb在构造函数的所有不同风格上设置断点.

$ gdb /path/to/binary

(gdb) break boost::bad_function_call::bad_function_call
Breakpoint 1 at 0x850f7bf: boost::bad_function_call::bad_function_call. (4 locations)

(gdb) info breakpoints
Num     Type           Disp Enb Address    What
1       breakpoint     keep y   <MULTIPLE>
1.1                         y     0x0850f7bf in boost::bad_function_call::bad_function_call() at /usr/include/boost/function/function_base.hpp:742
1.2                         y     0x0850fdd5 in boost::bad_function_call::bad_function_call(boost::bad_function_call const&) at /usr/include/boost/function/function_base.hpp:739
1.3                         y     0x0863b7d2 <boost::bad_function_call::bad_function_call()+4>
1.4                         y     0x086490ee <boost::bad_function_call::bad_function_call(boost::bad_function_call const&)+6>
Run Code Online (Sandbox Code Playgroud)

  • 要在异常的所有构造函数上设置断点,可以使用regex-break命令,例如:`rb my_exception :: my_exception` - 顺便说一下,`break boost :: bad_function_call()`命令真的适合你吗?我必须使用`break boost :: bad_function_call :: bad_function_call()`和gdb 7.8.2.否则它会说:'Function"boost :: bad_function_call()"not defined." (2认同)