在GDB和其他调试器中,有可能要求调试器(使用catch throw
)在该过程将所述异常传递给相应的异常处理程序之前,在引发异常时立即停止。
这是什么机制?是否有可用于挂接的操作系统信号?是否有指向猴子补丁的函数指针允许这样做?做到这一点是否只有一步?
在调试器之外还可以使用这种机制吗?
答案 0 :(得分:10)
GDB在库函数上设置一个断点,该函数进行堆栈展开(对于x86_64为__cxa_throw()
)来实现catch throw
。它将使用与设置任何其他类型的代码断点相同的机制来设置此断点。
这是什么机制?是否有可用于挂接的操作系统信号?是否有指向猴子补丁的函数指针允许这样做?做到这一点是否只有一步?
这些都不是。这只是__cxa_throw()
上的正常断点。 GDB使用了有关C ++运行时实现的知识,并带来了所有缺点。 C ++异常不在操作系统的监视范围之内,因此操作系统不会知道它们。造成混淆的原因是某些信号(例如segfaults)在Windows上称为 exceptions ,并且在调试时可以用与Windows上的C ++异常非常相似的方式进行处理。但这使OS信号(例如segfault)表现得像C ++异常,而不是相反。
另请参阅ftp://ftp.gnu.org/old-gnu/Manuals/gdb/html_node/gdb_30.html