Я хочу немного больше взглянуть на результирующий ASM (F#->IL->ASM), который генерируется для определенных функций, чисто из любопытства и обучения.
На мой взгляд, лучше использовать SOS.dll, но я столкнулся с небольшим препятствием...
Давайте начнем с самого простого кода на F#. Файл называется test.fs.
[]
let main _ =
stdin.ReadLine()
1
Мы определяем точку входа, которая принимает 'a (ограничена, не говоря нам (?), массивом строк по очевидным причинам (пустяки: нельзя использовать "'a" в функции точки входа?)). Затем мы ждем ввода пользователя. Это значительно упрощает взлом Windbg вручную. скомпилируйте test.fs для создания test.exe
Откройте Windbg, откройте test.exe внутри Windbg:
>!load C:\Windows\Microsoft.NET\Framework64\v4.0.30319\sos.dll
>g
Windbg запустит наш код и дождется цикла readline, затем мы можем ввести что-то в окно консоли, и Windbg завершит работу. .
Теперь, как нам разместить точку останова на main, чтобы мы могли прервать передциклом readline?
>!bpmd test.exe Test.main; g
Затем windbg войдет в цикл readline... Я ожидал, что он сломается до цикла readline, точка останова должна быть плохо определена. После этого я попробовал множество вариантов точек останова: !bpmd test.exe Test.main; !bpmd test.exe Тест; !bpmd test.exe основной; !bpmd test.exe Главное; !bpmd test.exe Main.test !bpmd test.exe Test... ect (но, возможно, пропустил один) совершенно очевидно, что я делаю что-то не так, я также пытался использовать модуль xx = ...,
Вопрос: Кто-нибудь может подсказать, как установить точку останова в управляемом коде F# из Windbg с помощью расширений SOS?
Ссылки:
http://winterdom.com/2011/06/having-fun-with-windbg
http://social.msdn.microsoft.com/Forums/en-US/clr/ thread/a0ab6170-d53b-4c95-8f5e-efaf4e014fcd
http://blogs.msdn.com/b/vancem/archive/2006/09/05/742062.aspx