在调试因未捕获的异常而失败的D代码时,异常机制会一直展开堆栈,然后打印堆栈跟踪,让我们的帮助有点不足:
(gdb) bt
No stack.
堆栈跟踪为我们提供了引发异常的行,但是如果它在几千次迭代之前不会抛出,那就不是特别有用了。能够将调试器设置为在一个点处断开是非常有用的。抛出一个异常。
目前,关于此的唯一文档似乎是dlang邮件列表上的一些帖子。我找到了一些适用于我的设置的方法,并将它们包含在我自己的答案中,但为了其他人的利益,我希望我们可以得到一个更全面的答案,其中包含任何组合的方法。 {dmd,gdc,ldc} x {gdb,lldb}。
因为DMD/DRuntime 2.082.0这可以通过将--DRT-trapException=0
旗帜传递给你的程序。亚当在评论中链接的PR已合并为此。
通过这个添加,您还可以使用比rt_trapExceptions
代码更漂亮的解决方案强制它在您的代码中:
extern(C) __gshared string[] rt_options = [ "trapExceptions=0" ];
您可以在此处阅读有关配置运行时选项的更多信息:https://dlang.org/phobos/rt_config.html
在此之前,您可以在This Week in D: August 7, 2016中描述的自定义main中设置rt_trapExceptions:
extern extern(C) __gshared bool rt_trapExceptions;
extern extern(C) int _d_run_main(int, char**, void*);
extern(C) int main(int argc, char** argv) {
rt_trapExceptions = false;
return _d_run_main(argc, argv, &_main);
}
int _main() {
// your code here
}
所有这些都在Linux上进行了测试。 -g标志被传递给所有三个编译器。 -d-debug标志也被传递给ldc,它完成了所有的好处。