当在 D 中抛出异常时,如何使调试器中断?
How do I make the debugger break when an exception is thrown in D?
当调试由于未捕获的异常而失败的 D 代码时,异常机制会一直向后展开堆栈,然后打印堆栈跟踪,给我们留下的帮助不大:
(gdb) bt
No stack.
堆栈跟踪为我们提供了抛出异常的行,但如果它直到几千次迭代才抛出,这就不是特别有用了。能够将调试器设置为中断将非常有用每当抛出一个异常时。
目前,唯一的文档似乎是 dlang 邮件列表中的一些帖子。我找到了一些适用于我的设置的方法,并将它们包含在我自己的答案中,但是为了其他有这个问题的人的利益,我希望我们能得到一个更全面的答案,其中包含任何组合的方法{ dmd, gdc, ldc } x { gdb, lldb }.
所有这些都在 Linux 上进行了测试。 -g 标志被传递给所有三个编译器。 -d-debug 标志也被传递给 ldc,因为它所做的一切都是好的。
gdb
(gdb) 中断 _d_throwdwarf
- 适用于 linux + dmd
- 不适用于 linux + gdc
- 不适用于 linux + ldc
(gdb) 中断 _d_throwc
- 未知,但运行时源似乎表明这是 _d_throwdwarf 用于 win32 和 win64。有 Windows 系统的人想测试一下吗?
(gdb) 中断 object.Throwable.this
- 适用于 linux + dmd
- 适用于 linux + gdc
- 不适用于 linux + ldc
(gdb) 捕捉抛出|捕捉|信号
- 不适用于 linux + dmd 或 linux + gdc
lldb
(lldb) b _d_throwdwarf
- 适用于 linux + dmd
因为 DMD/DRuntime 2.082.0 这可以通过将 --DRT-trapException=0
标志传递给您的程序来实现。 Adam 在评论中链接的 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
}
当调试由于未捕获的异常而失败的 D 代码时,异常机制会一直向后展开堆栈,然后打印堆栈跟踪,给我们留下的帮助不大:
(gdb) bt
No stack.
堆栈跟踪为我们提供了抛出异常的行,但如果它直到几千次迭代才抛出,这就不是特别有用了。能够将调试器设置为中断将非常有用每当抛出一个异常时。
目前,唯一的文档似乎是 dlang 邮件列表中的一些帖子。我找到了一些适用于我的设置的方法,并将它们包含在我自己的答案中,但是为了其他有这个问题的人的利益,我希望我们能得到一个更全面的答案,其中包含任何组合的方法{ dmd, gdc, ldc } x { gdb, lldb }.
所有这些都在 Linux 上进行了测试。 -g 标志被传递给所有三个编译器。 -d-debug 标志也被传递给 ldc,因为它所做的一切都是好的。
gdb
(gdb) 中断 _d_throwdwarf
- 适用于 linux + dmd
- 不适用于 linux + gdc
- 不适用于 linux + ldc
(gdb) 中断 _d_throwc
- 未知,但运行时源似乎表明这是 _d_throwdwarf 用于 win32 和 win64。有 Windows 系统的人想测试一下吗?
(gdb) 中断 object.Throwable.this
- 适用于 linux + dmd
- 适用于 linux + gdc
- 不适用于 linux + ldc
(gdb) 捕捉抛出|捕捉|信号
- 不适用于 linux + dmd 或 linux + gdc
lldb
(lldb) b _d_throwdwarf
- 适用于 linux + dmd
因为 DMD/DRuntime 2.082.0 这可以通过将 --DRT-trapException=0
标志传递给您的程序来实现。 Adam 在评论中链接的 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_trapExceptionsextern 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
}