F#
debug
F#Day 7

Debug F# with sdb!

This article is F# Advent Calendar2017 7th day
see : F# Advent Calendar2017

Summary

I just try to debug F# code with sdb!

Like this

image.png

What is mono/sdb?

A command line client for the Mono soft debugger.
mono/sdb

Environment

$ sw_vers 
ProductName:    Mac OS X
ProductVersion: 10.13.1
BuildVersion:   17B1003

$ uname -a
Darwin callmekoheis-MacBook-Air.local
17.2.0 Darwin Kernel
Version 17.2.0:
Fri Sep 29 18:27:05 PDT 2017;
root:xnu-4570.20.62~3/RELEASE_X86_64 x86_64

$ mono --version
Mono JIT compiler version 5.0.1.1 (2017-02/5077205 Sun Sep 17 18:29:46 BST 2017)
Copyright (C) 2002-2014 Novell, Inc, Xamarin Inc and Contributors. www.mono-project.com
    TLS:           normal
    SIGSEGV:       altstack
    Notification:  kqueue
    Architecture:  amd64
    Disabled:      none
    Misc:          softdebug 
    LLVM:          supported, not enabled.
    GC:            sgen (concurrent by default)

Prepare

install mono/sdb

$ git clone https://github.com/mono/sdb

$ cd sdb

$ git submodule update --init --recursive

$ make

check

$ sdb --version
Mono soft debugger (sdb) 1.5.6503.20649

$ which sdb
/usr/local/bin/sdb

setting

$ which mono
/usr/local/bin/mono

// set location of mono
$ sdb
(sdb) cfg s RuntimePrefix /usr/local/ ( was /usr )

Debug

// write code
$ vim sample.fsx 

namespace ABC

module DEF =
    let bar() =
        stdout.WriteLine("abc")

    let foo (str:string) =
        stdout.WriteLine(str)
        bar()

    [<EntryPointAttribute>]
    let main _ =
        let s = "Foo!"
        foo s
        stdout.WriteLine("callmekohei")
        0

// compile
$ fsharpc -g --optimize- sample.fsx 

// launch sdb
$ sdb
Welcome to the Mono soft debugger (sdb 1.5.6548.37600)
Type 'help' for a list of commands or 'quit' to exit

// set break point
(sdb) bp add func ABC.DEF.foo
Breakpoint '0' added for method 'ABC.DEF.foo'

// run 
(sdb) r sample.exe
Inferior process '8743' ('sample.exe') started
Hit method breakpoint on 'ABC.DEF.foo'
#0 [0x00000000] ABC.DEF.foo at /Users/callmekohei/tmp/xxx/sample.fsx:8
        stdout.WriteLine(str)

// look source code
(sdb) src
       1:    namespace ABC
       2:    
       3:    module DEF =
       4:        let bar() =
       5:            stdout.WriteLine("abc")
       6:    
       7:        let foo (str:string) =
       8:            stdout.WriteLine(str)  // <--- color green!
       9:            bar()
      10:    
      11:        [<EntryPointAttribute>]
      12:        let main _ =
      13:            let s = "Foo!"
      14:            foo s
      15:            stdout.WriteLine("callmekohei")
      16:            0

// continue
(sdb) c
Inferior process '8743' ('sample.exe') resumed
Foo!
abc
callmekohei
Inferior process '8743' ('sample.exe') exited with code '0'

// quiet
(sdb) q
Bye

Point

compile option --optimize-

$ fsharpc -g --optimize- sample.fsx