GDB:当抛出特定的异常类型时如何中断? [英] GDB: How to break when a specific exception type is thrown?
问题描述
根据文档,我可以通过使用条件断点打破特定的异常类型。但是条件的语法对我来说不是很清楚:
条件bnum< expression>
查看表达式语法我认为这是我需要的模式:
{type} addr
但是,我不知道应该为 addr
参数传递什么。我尝试以下:
(gdb)catch throw
(gdb)condition 1 boost :: bad_function_call *
但它不工作(gdb在所有异常类型上断开)。
任何人都可以帮助?
更新
我也尝试过@ Adam的建议,它会导致错误消息:
(gdb)catch throw boost :: bad_function_call
在参数末尾。
没有 boost ::
命名空间: p>
(gdb)catch throw bad_function_call
在参数结尾处的垃圾。
解决方法
打破构造函数bad_function_call
有效。解决方案/ p>
文档建议
catch throw< exceptname>
可用于在类型< exceptname>
被抛出;(gdb)help catch
设置catchpoints来捕捉事件。
可以捕获上升的信号:
捕捉信号 - 所有信号
捕捉信号< signame> - 特定信号
引发的异常可能被捕获:
catch throw - 抛出时所有异常
catch throw< exceptname> - 抛出时的特定异常
catch catch - 当捕获时所有异常
catch catch< exceptname> - 一个特殊的异常,当被捕获
线程或进程事件可能被捕获:
catch thread_start - 任何线程,刚创建后
catch thread_exit - 任何线程,在到期之前
catch thread_join - 任何线程,只是在连接之后
可以捕获进程事件:
catch start - 任何进程,刚创建后
catch exit - 任何进程,在到期前
catch fork - 调用fork()
catch vfork - 调用vfork()
catch exec - 调用exec()
可以捕获动态链接的库事件:
catch load - 任何库的负载
catch load< libname> - 特定库的加载
catch unload - 卸载任何库
catch unload< libname> - 卸载特定库
程序执行停止的行为也可能被捕获:
catch stop
可能会捕获C ++异常:
catch throw - all异常,当抛出
catch catch - 所有异常,当捕获
时Ada异常可能被捕获:
catch异常 - 当引发时所有异常
catch exception< name> - 一个特殊的异常,当被引发
catch异常未处理 - 所有未处理的异常,当提出
catch assert - 所有失败的断言,当提出
执行help set follow-fork-模式的信息调试程序
后叉或vfork被捕获。
对处理断点的其他命令的信息执行帮助断点。
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:
condition bnum <expression>
Looking at the expression syntax I think this is the pattern I need:
{type} addr
However, I don't know what I should pass for the
addr
argument. I tried the following:(gdb) catch throw (gdb) condition 1 boost::bad_function_call *
But it doesn't work (gdb breaks on all exception types).
Can anyone help?
Update
I also tried @Adam's suggestion, but it results in an error message:(gdb) catch throw boost::bad_function_call Junk at end of arguments.
Without
boost::
namespace:(gdb) catch throw bad_function_call Junk at end of arguments.
Workaround
Breaking in the constructor ofbad_function_call
works.解决方案EDIT
The documentation suggests that
catch throw <exceptname>
can be used to break whenever an exception of type<exceptname>
is thrown; however, that doesn't seem to work in practice.(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.
这篇关于GDB:当抛出特定的异常类型时如何中断?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!