根据文档,我可以通过使用条件断点来打破特定的异常类型.但是条件的语法对我来说不是很清楚:
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中断所有异常类型).
有人可以帮忙吗?
(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)
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)