Вы стали жертвой оптимизаций, которые затрудняют отладку в любом наборе инструментов.
Обратите внимание, что для fsc
оптимизации включены по умолчанию . Это:
Inlining
foo()
даже не вызывается - это простой метод c stati, который можно легко встроить. Полученный IL эквивалентен:
let main argv =
PrintfModule.PrintFormatToStringThenFail(new PrintfFormat<_>("foo"));
0
Мы можем отключить это с помощью --optimize-
fsc -g --optimize- Program.fs
Но этого все еще недостаточно. Из-за ...
Оптимизация хвостового вызова
Оптимизация хвостового вызова позволяет избежать выделения нового стекового фрейма для функции. foo
- это простая функция, которая шортит main
. А поскольку нет стекового фрейма, вы не видите его в трассировке стека.
Мы можем отключить это с помощью --tailcalls-
.
Для полной отладки, go с что VS делает в основном для DEBUG
:
fsc --debug:full --define:DEBUG --define:TRACE --optimize- --tailcalls- Program.fs
Теперь, если мы запустим нашу цель, мы получим трассировку стека, как и ожидалось:
Unhandled Exception: System.Exception: foo
at Microsoft.FSharp.Core.PrintfModule.PrintFormatToStringThenFail@1639.Invoke(String message)
at Program.foo[a]() in Program.fs:line 4
at Program.main(String[] argv) in Program.fs:line 13