Как сделать, чтобы отладчик сломался, если в D выброшено исключение? - PullRequest
0 голосов
/ 25 апреля 2018

При отладке кода D, который завершается с ошибкой из-за необработанного исключения, механизм исключений полностью развертывает стек, а затем печатает трассировку стека, оставляя нам несколько менее полезную информацию:

(gdb) bt
No stack.

Трассировка стека дает нам строку, из которой было сгенерировано исключение, но это не особенно полезно, если она не генерирует до нескольких тысяч итераций. Было бы весьма полезно иметь возможность настроить отладчик на разрыв в точка исключения всякий раз, когда его бросают.

На данный момент единственной документацией по этому вопросу являются несколько постов в списках рассылки dlang. Я нашел несколько подходов, которые работают с моей установкой, и включил их в свой собственный ответ, но я надеюсь, что мы сможем получить более полный ответ, содержащий подходы для любой комбинации {dmd, gdc, ldc} x {gdb, lldb}.

Ответы [ 2 ]

0 голосов
/ 01 мая 2019

, начиная с 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


До этого вы могли устанавливать rt_trapExceptions в пользовательской основной сети, как описано в Эта неделя в D: 7 августа 2016 г.:

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
}
0 голосов
/ 25 апреля 2018

Все они были протестированы на Linux.Флаг -g был передан всем трем компиляторам.Флаг -d-debug также был передан ldc, несмотря ни на что.

gdb

(gdb) break _d_throwdwarf

  • Работает на linux +dmd
  • не работает на linux + gdc
  • не работает на linux + ldc

(gdb) break _d_throwc

  • неизвестно, но источник в druntime, похоже, предполагает, что это _d_throwdwarf для win32 и win64.Кто-нибудь с системой Windows хочет проверить это?

(gdb) объект разрыва. Throwable.this

  • Работает на Linux + DMD
  • Работает наlinux + gdc
  • не работает на linux + ldc

(gdb) catch throw | catch | signal

  • не работает на linux + dmdили linux + gdc

lldb

(lldb) b _d_throwdwarf

  • работает на linux + dmd
...