在 GDB 中抛出特定异常类型时如何中断?
根据文档,我可以通过使用条件断点来中断特定的异常类型.但是条件的语法对我来说不是很清楚:
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 *
但它不起作用(gdb 中断所有异常类型).
But it doesn't work (gdb breaks on all exception types).
谁能帮忙?
更新
我也尝试了@Adam 的建议,但它会导致错误消息: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.
没有 boost::
命名空间:
(gdb) catch throw bad_function_call
Junk at end of arguments.
解决方法
打破bad_function_call
的构造函数是可行的.
Workaround
Breaking in the constructor ofbad_function_call
works.
推荐答案
编辑
文档建议 catch throw <exceptname>
可用于在抛出 <exceptname>
类型的异常时中断;但是,这在实践中似乎行不通.
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.
相关文章