在D中抛出异常时,如何使调试器中断?

时间:2018-04-24 21:38:33

标签: debugging gdb d lldb

当调试因未捕获的异常而失败的D代码时,异常机制会一直展开堆栈,然后打印堆栈跟踪,让我们的帮助有点不足:

(gdb) bt
No stack.

堆栈跟踪为我们提供了抛出异常的行,但如果它在几千次迭代之前不会抛出,那就不是特别有帮助了。能够设置它会非常有用每当抛出一个异常时,调试器就会在异常点处中断。

目前,关于此的唯一文档似乎是dlang邮件列表上的一些帖子。我找到了一些适用于我的设置的方法,并将它们包含在我自己的答案中,但为了其他人的利益,我希望我们能够得到一个包含方法的更全面的答案对于{dmd,gdc,ldc} x {gdb,lldb}的任意组合。

2 个答案:

答案 0 :(得分:2)

由于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中的说明在自定义主目录中设置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
}

答案 1 :(得分:0)

所有这些都在Linux上进行了测试。 -g标志被传递给所有三个编译器。 -d-debug标志也被传递给ldc,它完成了所有的好处。

的gdb

(gdb)break _d_throwdwarf

  • 适用于linux + dmd
  • 不适用于linux + gdc
  • 不适用于linux + ldc

(gdb)break _d_throwc

  • 未知,但druntime来源似乎暗示这是win32和win64的_d_throwdwarf。任何拥有Windows系统的人都想测试它吗?

(gdb)break object.Throwable.this

  • 适用于linux + dmd
  • 适用于linux + gdc
  • 不适用于linux + ldc

(gdb)catch throw | catch | signal

  • 不适用于linux + dmd或linux + gdc

LLDB

(lldb)b _d_throwdwarf

  • 适用于linux + dmd