【发布时间】:2018-04-24 21:38:33
【问题描述】:
当调试由于未捕获的异常而失败的 D 代码时,异常机制会一直展开堆栈,然后打印堆栈跟踪,给我们留下一些帮助不大的信息:
(gdb) bt
No stack.
堆栈跟踪为我们提供了引发异常的行,但如果它直到几千次迭代才抛出,这并不是特别有用。能够将调试器设置为在抛出异常时的异常点。
目前,关于这方面的唯一文档似乎是 dlang 邮件列表上的一些帖子。我找到了一些适用于我的设置的方法,并将它们包含在我自己的答案中,但是为了其他有这个问题的人的利益,我希望我们能得到一个更全面的答案,其中包含任何组合的方法{ dmd, gdc, ldc } x { gdb, lldb }。
【问题讨论】:
-
真正让我吃惊的是,有一个简单的解决方案可以设置一个内部变量,因此所有未捕获的异常都被调试器捕获,捕获的异常正常工作,适用于所有调试器、所有编译器、所有操作系统只需将命令行参数传递给您运行的程序......但他们从未合并 PR,尽管它似乎没有任何问题。 github.com/dlang/druntime/pull/2035
-
@AdamD.Ruppe 如果他们要求 _d_throw 在所有实现中必须以该名称存在,那就更好了,因为它不需要重新编译。但如果不出意外,您的
rt_trapExceptionshack 为我们提供了与 ldc 一起使用的 一些东西。 -
但是您实际上并不想中断 _d_throw,即使它存在,因为它会中断所有抛出的异常,包括程序中捕获的异常。 trapExceptions 的美妙之处在于它只捕获 uncaught 异常,因此您不必一直告诉它继续处理普通的、已处理的情况。 (有时候你希望它在投掷时打破,但你可以在投掷的特定线上打破而不是在所有静止)