Stack Traces in Haskell Arash Rouhani Chalmers University of - - PowerPoint PPT Presentation

stack traces in haskell
SMART_READER_LITE
LIVE PREVIEW

Stack Traces in Haskell Arash Rouhani Chalmers University of - - PowerPoint PPT Presentation

Stack Traces in Haskell Arash Rouhani Chalmers University of Technology Master thesis presentation March 21, 2014 Contents Motivation Background The attempt in August 2013 Contribution Arash Rouhani Thesis presentation


slide-1
SLIDE 1

Stack Traces in Haskell

Arash Rouhani

Chalmers University of Technology

Master thesis presentation March 21, 2014

slide-2
SLIDE 2

Contents

  • Motivation
  • Background
  • The attempt in August 2013
  • Contribution

Contents Arash Rouhani – Thesis presentation 2/32

slide-3
SLIDE 3

An old problem . . .

  • Try running this program:

1

main = print (f 10)

2

f x = ... g y ...

3

g x = ... h y ...

4

h x = ... head [] ...

Motivation Arash Rouhani – Thesis presentation 3/32

slide-4
SLIDE 4

An old problem . . .

  • Try running this program:

1

main = print (f 10)

2

f x = ... g y ...

3

g x = ... h y ...

4

h x = ... head [] ...

  • You get

$ runghc Crash.hs Crash.hs: Prelude.head: empty list

Motivation Arash Rouhani – Thesis presentation 3/32

slide-5
SLIDE 5

An old problem . . .

  • Try running this program:

1

main = print (f 10)

2

f x = ... g y ...

3

g x = ... h y ...

4

h x = ... head [] ...

  • You get

$ runghc Crash.hs Crash.hs: Prelude.head: empty list

  • But you want

$ runghc Crash.hs Crash.hs: Prelude.head: empty list in function h in function g in function f in function main

Motivation Arash Rouhani – Thesis presentation 3/32

slide-6
SLIDE 6

. . . with new constraints

  • Should have very low overhead
  • If you hesitate to use it in production, I’ve failed
  • Not done for Haskell before, all earlier work have an overhead.

Motivation Arash Rouhani – Thesis presentation 4/32

slide-7
SLIDE 7

Background contents

  • Is stack traces harder for Haskell?
  • Will the implementation only work for GHC?

Background Arash Rouhani – Thesis presentation 5/32

slide-8
SLIDE 8

Laziness

  • Consider the code

1

myIf :: Bool -> a -> a -> a

2

myIf True x y = x

3

myIf False x y = y

4 5

  • - Then evaluate

6

myIf True 5 (error "evil crash")

  • Will the usage of error make this crash?

Background — Haskell Arash Rouhani – Thesis presentation 6/32

slide-9
SLIDE 9

Laziness

  • Consider the code

1

myIf :: Bool -> a -> a -> a

2

myIf True x y = x

3

myIf False x y = y

4 5

  • - Then evaluate

6

myIf True 5 (error "evil crash")

  • Will the usage of error make this crash?
  • No, (error "evil crash") is a delayed computation.

Background — Haskell Arash Rouhani – Thesis presentation 6/32

slide-10
SLIDE 10

Case expressions

  • Consider the code

1

case myBool of

2

True

  • > this

3

Flase -> that

  • So is pattern matching just like switch-case in C?

Background — Haskell Arash Rouhani – Thesis presentation 7/32

slide-11
SLIDE 11

Case expressions

  • Consider the code

1

case myBool of

2

True

  • > this

3

Flase -> that

  • So is pattern matching just like switch-case in C?
  • NO!

Background — Haskell Arash Rouhani – Thesis presentation 7/32

slide-12
SLIDE 12

Case expressions

  • Consider the code

1

case myBool of

2

True

  • > this

3

Flase -> that

  • So is pattern matching just like switch-case in C?
  • NO!
  • myBool can be a delayed computation, aka a thunk

Background — Haskell Arash Rouhani – Thesis presentation 7/32

slide-13
SLIDE 13

History of GHC

  • Compiles Haskell to machine code since 1989
  • The only Haskell compiler people care about

Background — GHC Arash Rouhani – Thesis presentation 8/32

slide-14
SLIDE 14

Usage

  • Compile and run (just like any other compiler)

$ ghc --make Code.hs ... $ ./a.out 123

Background — GHC Arash Rouhani – Thesis presentation 9/32

slide-15
SLIDE 15

The magical function

  • My work assumes the existence of

1

getDebugInfo :: Ptr Instruction -- Pointer to runnable machine code

2

  • > IO DebugInfo -- Haskell function name etc.

Background — GHC— Magic function Arash Rouhani – Thesis presentation 10/32

slide-16
SLIDE 16

The magical function

  • My work assumes the existence of

1

getDebugInfo :: Ptr Instruction -- Pointer to runnable machine code

2

  • > IO DebugInfo -- Haskell function name etc.
  • This is a recent contribution not yet merged in HEAD
  • Author is Peter Wortmann, part of his PhD at Leeds

Background — GHC— Magic function Arash Rouhani – Thesis presentation 10/32

slide-17
SLIDE 17

The magical function

  • My work assumes the existence of

1

getDebugInfo :: Ptr Instruction -- Pointer to runnable machine code

2

  • > IO DebugInfo -- Haskell function name etc.
  • This is a recent contribution not yet merged in HEAD
  • Author is Peter Wortmann, part of his PhD at Leeds
  • In essence, 95% of the job to implement stack traces was

already done!

Background — GHC— Magic function Arash Rouhani – Thesis presentation 10/32

slide-18
SLIDE 18

The compilation pipeline

  • Well GHC works like this:

Haskell GHC Executable

Background — GHC— Magic function Arash Rouhani – Thesis presentation 11/32

slide-19
SLIDE 19

The compilation pipeline

  • Well GHC works like this:

Haskell GHC Executable

  • Or rather like this

Object Files Executable Haskell Core STG Cmm Assembly

Background — GHC— Magic function Arash Rouhani – Thesis presentation 11/32

slide-20
SLIDE 20

The compilation pipeline

  • Well GHC works like this:

Haskell GHC Executable

  • Or rather like this

Object Files Executable Haskell Core STG Cmm Assembly

  • We say that GHC has many Intermediate Representations

Background — GHC— Magic function Arash Rouhani – Thesis presentation 11/32

slide-21
SLIDE 21

So there must be debug data!

  • Again:

Haskell GHC Executable

Background — GHC— Magic function Arash Rouhani – Thesis presentation 12/32

slide-22
SLIDE 22

So there must be debug data!

  • Again:

Haskell GHC Executable

  • The intuition behind getDebugInfo is:

Haskell Executable getDebugInfo

Background — GHC— Magic function Arash Rouhani – Thesis presentation 12/32

slide-23
SLIDE 23

So there must be debug data!

  • Again:

Haskell GHC Executable

  • The intuition behind getDebugInfo is:

Haskell Executable getDebugInfo

  • For this, we must retain debug data in the binary!

Background — GHC— Magic function Arash Rouhani – Thesis presentation 12/32

slide-24
SLIDE 24

Lets get to work!

addition :: Int -> Int -> Int addition x y = (x + y) addition_r8m :: GHC.Types.Int -> GHC.Types.Int -> GHC.Types.Int [GblId, Arity=2, Str=DmdType] addition_r8m = \ (x_a9l :: GHC.Types.Int) (y_a9m :: GHC.Types.Int) -> GHC.Num.+ @ GHC.Types.Int GHC.Num.$fNumInt x_a9l y_a9m addition_r8m :: GHC.Types.Int -> GHC.Types.Int -> GHC.Types.Int [GblId, Arity=2, Str=DmdType, Unf=OtherCon []] = sat-only \r srt:SRT:[(r9o, GHC.Num.$fNumInt)] [x_smq y_smr] GHC.Num.+ GHC.Num.$fNumInt x_smq y_smr;

Successive recastings Haskell Core

... cmG: R2 = GHC.Num.$fNumInt_closure; // CmmAssign I64[(old + 32)] = stg_ap_pp_info; // CmmStore P64[(old + 24)] = _smo::P64; // CmmStore P64[(old + 16)] = _smp::P64; // CmmStore call GHC.Num.+_info(R2) args: 32, res: 0, upd: 8; // CmmCall ...

Stg Cmm

... _cmG: movq %r14,%rax movl $GHC.Num.$fNumInt_closure,%r14d movq $stg_ap_pp_info,-24(%rbp) movq %rax,-16(%rbp) movq %rsi,-8(%rbp) addq $-24,%rbp jmp GHC.Num.+_info ...

x64 assembly

addition :: Int -> Int -> Int addition x y = (x + y) addition_r8m :: GHC.Types.Int -> GHC.Types.Int -> GHC.Types.Int [GblId, Arity=2, Str=DmdType] \ (x_a9l :: GHC.Types.Int) (y_a9m :: GHC.Types.Int) -> src<stages.hs:3:1-22> GHC.Num.+ @ GHC.Types.Int GHC.Num.$fNumInt (src<stages.hs:3:17> x_a9l) (src<stages.hs:3:21> y_a9m) addition_r8m :: GHC.Types.Int -> GHC.Types.Int -> GHC.Types.Int [GblId, Arity=2, Str=DmdType, Unf=OtherCon []] = sat-only \r srt:SRT:[(r9o, GHC.Num.$fNumInt)] [x_smq y_smr] src<stages.hs:3:1-22> src<stages.hs:3:17> src<stages.hs:3:21> GHC.Num.+ GHC.Num.$fNumInt x_smq y_smr;

Successive recastings Haskell Core

... //tick src<stages.hs:3:1-22> //tick src<stages.hs:3:17> //tick src<stages.hs:3:21> ... CmG: R2 = GHC.Num.$fNumInt_closure; // CmmAssign I64[(old + 32)] = stg_ap_pp_info; // CmmStore P64[(old + 24)] = _smo::P64; // CmmStore P64[(old + 16)] = _smp::P64; // CmmStore call GHC.Num.+_info(R2) args: 32, res: 0, upd: 8; // CmmCall ...

Stg Cmm

... _cmG: movq %r14,%rax movl $GHC.Num.$fNumInt_closure,%r14d movq $stg_ap_pp_info,-24(%rbp) movq %rax,-16(%rbp) movq %rsi,-8(%rbp) addq $-24,%rbp jmp GHC.Num.+_info ...

x64 assembly

Background — GHC— Magic function Arash Rouhani – Thesis presentation 13/32

slide-25
SLIDE 25

What happened?

... ... _cmG: movq %r14,%rax movl $GHC.Num.$fNumInt_closure,%r14d movq $stg_ap_pp_info,-24(%rbp) movq %rax,-16(%rbp) movq %rsi,-8(%rbp) addq $-24,%rbp jmp GHC.Num.+_info ...

x64 assembly

... ... _cmG: movq %r14,%rax movl $GHC.Num.$fNumInt_closure,%r14d movq $stg_ap_pp_info,-24(%rbp) movq %rax,-16(%rbp) movq %rsi,-8(%rbp) addq $-24,%rbp jmp GHC.Num.+_info ...

x64 assembly

  • Did we just drop the debug data we worked so hard for?

Background — GHC— Magic function Arash Rouhani – Thesis presentation 14/32

slide-26
SLIDE 26

This is a solved problem, of course!

  • DWARF to the rescue!

< 1><0x0000008d> DW_TAG_subprogram DW_AT_name "addition" DW_AT_MIPS_linkage_name "r8m_info" DW_AT_external no DW_AT_low_pc 0x00000020 DW_AT_high_pc 0x00000054 DW_AT_frame_base DW_OP_call_frame_cfa < 2><0x000000b3> DW_TAG_lexical_block DW_AT_name "cmG_entry" DW_AT_low_pc 0x00000029 DW_AT_high_pc 0x0000004b < 2><0x000000cf> DW_TAG_lexical_block DW_AT_name "cmF_entry" DW_AT_low_pc 0x0000004b DW_AT_high_pc 0x00000054

Background — GHC— Magic function Arash Rouhani – Thesis presentation 15/32

slide-27
SLIDE 27

This is a solved problem, of course!

  • DWARF to the rescue!

< 1><0x0000008d> DW_TAG_subprogram DW_AT_name "addition" DW_AT_MIPS_linkage_name "r8m_info" DW_AT_external no DW_AT_low_pc 0x00000020 DW_AT_high_pc 0x00000054 DW_AT_frame_base DW_OP_call_frame_cfa < 2><0x000000b3> DW_TAG_lexical_block DW_AT_name "cmG_entry" DW_AT_low_pc 0x00000029 DW_AT_high_pc 0x0000004b < 2><0x000000cf> DW_TAG_lexical_block DW_AT_name "cmF_entry" DW_AT_low_pc 0x0000004b DW_AT_high_pc 0x00000054

  • DWARF lives side by side in another section of the binary.

Therefore it does not interfere.

Background — GHC— Magic function Arash Rouhani – Thesis presentation 15/32

slide-28
SLIDE 28

Introduction to the Execution Stack

  • GHC chooses to implement Haskell with a stack.

Background — GHC— The Stack Arash Rouhani – Thesis presentation 16/32

slide-29
SLIDE 29

Introduction to the Execution Stack

  • GHC chooses to implement Haskell with a stack.
  • It does not use the normal “C-stack”

Background — GHC— The Stack Arash Rouhani – Thesis presentation 16/32

slide-30
SLIDE 30

Introduction to the Execution Stack

  • GHC chooses to implement Haskell with a stack.
  • It does not use the normal “C-stack”
  • GHC maintains its own stack, we call it the execution stack.

Background — GHC— The Stack Arash Rouhani – Thesis presentation 16/32

slide-31
SLIDE 31

Similar but not same

  • Unlike C, we do not push something on the stack when

entering a function!

Background — GHC— The Stack Arash Rouhani – Thesis presentation 17/32

slide-32
SLIDE 32

Similar but not same

  • Unlike C, we do not push something on the stack when

entering a function!

  • Unlike C, we have cheap green threads, one stack per thread!

Background — GHC— The Stack Arash Rouhani – Thesis presentation 17/32

slide-33
SLIDE 33

What is on it then?

  • Recall this code:

1

case myBool of

2

True

  • > this

3

Flase -> that

Background — GHC— The Stack Arash Rouhani – Thesis presentation 18/32

slide-34
SLIDE 34

What is on it then?

  • Recall this code:

1

case myBool of

2

True

  • > this

3

Flase -> that

  • How is this implemented? Let’s think for a while . . .

Background — GHC— The Stack Arash Rouhani – Thesis presentation 18/32

slide-35
SLIDE 35

What is on it then?

  • Recall this code:

1

case myBool of

2

True

  • > this

3

Flase -> that

  • How is this implemented? Let’s think for a while . . .
  • Aha! We can push a continuation on the stack and jump to

the code of myBool!

Background — GHC— The Stack Arash Rouhani – Thesis presentation 18/32

slide-36
SLIDE 36

What is on it then?

  • Recall this code:

1

case myBool of

2

True

  • > this

3

Flase -> that

  • How is this implemented? Let’s think for a while . . .
  • Aha! We can push a continuation on the stack and jump to

the code of myBool!

  • We call this a case continuation.

Background — GHC— The Stack Arash Rouhani – Thesis presentation 18/32

slide-37
SLIDE 37

Peter’s demonstration

  • In August 2013 Peter Wortmann showed a proof of concept

stack trace based on his work.

The breakthrough in August 2013 Arash Rouhani – Thesis presentation 19/32

slide-38
SLIDE 38

Peter’s demonstration

  • In August 2013 Peter Wortmann showed a proof of concept

stack trace based on his work.

  • My master thesis is entirely based on Peter’s work.

The breakthrough in August 2013 Arash Rouhani – Thesis presentation 19/32

slide-39
SLIDE 39

The stack trace . . .

  • For this Haskell code:

1

main :: IO ()

2

main = do a

3

print 2

4 5

a, b :: IO ()

6

a = do b

7

print 20

8 9

b = do print (crashSelf 2)

10

print 200

11 12

crashSelf :: Int -> Int

13

crashSelf 0 = 1 ‘div‘ 0

14

crashSelf x = crashSelf (x - 1)

The breakthrough in August 2013 Arash Rouhani – Thesis presentation 20/32

slide-40
SLIDE 40

. . . is terrible!

  • We get:

0: stg_bh_upd_frame_ret 1: stg_bh_upd_frame_ret 2: stg_bh_upd_frame_ret 3: showSignedInt 4: stg_upd_frame_ret 5: writeBlocks 6: stg_ap_v_ret 7: bindIO 8: bindIO 9: bindIO 10: stg_catch_frame_ret

The breakthrough in August 2013 Arash Rouhani – Thesis presentation 21/32

slide-41
SLIDE 41

. . . is terrible!

  • We get:

0: stg_bh_upd_frame_ret 1: stg_bh_upd_frame_ret 2: stg_bh_upd_frame_ret 3: showSignedInt 4: stg_upd_frame_ret 5: writeBlocks 6: stg_ap_v_ret 7: bindIO 8: bindIO 9: bindIO 10: stg_catch_frame_ret

  • We want:

0: crashSelf 1: crashSelf 2: print 3: b 4: a 5: main

The breakthrough in August 2013 Arash Rouhani – Thesis presentation 21/32

slide-42
SLIDE 42

Then what did Arash do?

  • In addition to an unreadable stack trace, the time and memory

complexity of stack reification can be improved.

Contribution Arash Rouhani – Thesis presentation 22/32

slide-43
SLIDE 43

Then what did Arash do?

  • In addition to an unreadable stack trace, the time and memory

complexity of stack reification can be improved.

  • The stack reification in Peter Wortmann’s demonstration is

linear in time and memory.

Contribution Arash Rouhani – Thesis presentation 22/32

slide-44
SLIDE 44

Then what did Arash do?

  • In addition to an unreadable stack trace, the time and memory

complexity of stack reification can be improved.

  • The stack reification in Peter Wortmann’s demonstration is

linear in time and memory.

  • Obviously, if you throw a stack and then print it. It can not be

worse than linear in time.

Contribution Arash Rouhani – Thesis presentation 22/32

slide-45
SLIDE 45

Then what did Arash do?

  • In addition to an unreadable stack trace, the time and memory

complexity of stack reification can be improved.

  • The stack reification in Peter Wortmann’s demonstration is

linear in time and memory.

  • Obviously, if you throw a stack and then print it. It can not be

worse than linear in time.

  • But, if you throw a stack and do not print it, a reification that

is done lazily would be done in constant time.

Contribution Arash Rouhani – Thesis presentation 22/32

slide-46
SLIDE 46

So the problems to tackle are:

  • Make stack traces readable

Contribution Arash Rouhani – Thesis presentation 23/32

slide-47
SLIDE 47

So the problems to tackle are:

  • Make stack traces readable
  • Make reification optimal complexity wise

Contribution Arash Rouhani – Thesis presentation 23/32

slide-48
SLIDE 48

So the problems to tackle are:

  • Make stack traces readable
  • Make reification optimal complexity wise
  • Add a Haskell interface to this

Contribution Arash Rouhani – Thesis presentation 23/32

slide-49
SLIDE 49

We must understand the stack

  • What is on the stack?

Contribution — Using the execution stack Arash Rouhani – Thesis presentation 24/32

slide-50
SLIDE 50

We must understand the stack

  • What is on the stack?
  • The C stack just have return addresses and local variables.

Contribution — Using the execution stack Arash Rouhani – Thesis presentation 24/32

slide-51
SLIDE 51

We must understand the stack

  • What is on the stack?
  • The C stack just have return addresses and local variables.
  • The Haskell stack have many different kinds of members. Case

continuations, update frames, catch frames, stm frames, stop frame, underflow frames etc.

Contribution — Using the execution stack Arash Rouhani – Thesis presentation 24/32

slide-52
SLIDE 52

We must understand the stack

  • What is on the stack?
  • The C stack just have return addresses and local variables.
  • The Haskell stack have many different kinds of members. Case

continuations, update frames, catch frames, stm frames, stop frame, underflow frames etc.

  • Contribution — Using the execution stack

Arash Rouhani – Thesis presentation 24/32

slide-53
SLIDE 53

Update frames

  • Consider

1

powerTwo :: Int -> Int

2

powerTwo 0 = 1

3

powerTwo n = x + x

4

where x = powerTwo (n - 1)

Contribution — Using the execution stack Arash Rouhani – Thesis presentation 25/32

slide-54
SLIDE 54

Update frames

  • Consider

1

powerTwo :: Int -> Int

2

powerTwo 0 = 1

3

powerTwo n = x + x

4

where x = powerTwo (n - 1)

  • In GHC, thunks are memoized by default

Contribution — Using the execution stack Arash Rouhani – Thesis presentation 25/32

slide-55
SLIDE 55

Update frames

  • Consider

1

powerTwo :: Int -> Int

2

powerTwo 0 = 1

3

powerTwo n = x + x

4

where x = powerTwo (n - 1)

  • In GHC, thunks are memoized by default
  • This is done by update frames on the stack

Contribution — Using the execution stack Arash Rouhani – Thesis presentation 25/32

slide-56
SLIDE 56

Update frames

  • Consider

1

powerTwo :: Int -> Int

2

powerTwo 0 = 1

3

powerTwo n = x + x

4

where x = powerTwo (n - 1)

  • In GHC, thunks are memoized by default
  • This is done by update frames on the stack
  • Details omitted in interest of time

Contribution — Using the execution stack Arash Rouhani – Thesis presentation 25/32

slide-57
SLIDE 57

New policy for reifying update frames

  • So instead of saying that we have an update frame, refer to its

updatee.

0: stg_bh_upd_frame_ret

  • ---------->

0: divZeroError 1: stg_bh_upd_frame_ret

  • ---------->

1: crashSelf 2: stg_bh_upd_frame_ret

  • ---------->

2: b 3: showSignedInt

  • ---------->

3: showSignedInt 4: stg_upd_frame_ret

  • ---------->

4: print 5: writeBlocks

  • ---------->

5: writeBlocks 6: stg_ap_v_ret

  • ---------->

6: stg_ap_v_ret 7: bindIO

  • ---------->

7: bindIO 8: bindIO

  • ---------->

8: bindIO 9: bindIO

  • ---------->

9: bindIO 10: stg_catch_frame_ret

  • ---------->

10: stg_catch_frame_ret

Contribution — Using the execution stack Arash Rouhani – Thesis presentation 26/32

slide-58
SLIDE 58

Other frames

  • Many of the frames are interesting. But the most common one

is probably case continuations, which luckily are unique and therefore useful when applying getDebugInfo

Contribution — Using the execution stack Arash Rouhani – Thesis presentation 27/32

slide-59
SLIDE 59

The problem

  • On a crash, the stack is unwounded and the stack reified
  • Control is passed to the first catch frame on the stack

Contribution — Reifying efficiently Arash Rouhani – Thesis presentation 28/32

slide-60
SLIDE 60

The problem

  • On a crash, the stack is unwounded and the stack reified
  • Control is passed to the first catch frame on the stack
  • Imagine the function

1

catchWithStack :: Exception e =>

2

IO a

  • - Action to run

3

  • > (e -> Stack -> IO a) -- Handler

4

  • > IO a
  • What can Stack be?
  • Can it really be lazily evaluated?

Contribution — Reifying efficiently Arash Rouhani – Thesis presentation 28/32

slide-61
SLIDE 61

The problem

  • On a crash, the stack is unwounded and the stack reified
  • Control is passed to the first catch frame on the stack
  • Imagine the function

1

catchWithStack :: Exception e =>

2

IO a

  • - Action to run

3

  • > (e -> Stack -> IO a) -- Handler

4

  • > IO a
  • What can Stack be?
  • Can it really be lazily evaluated?
  • We have to be really careful, the stack is a mutable data

structure!

Contribution — Reifying efficiently Arash Rouhani – Thesis presentation 28/32

slide-62
SLIDE 62

One idea

  • Internally, the execution stack is a chunked linked list.
  • What if we freeze the stack and continue our stack in a new

chunk?

Contribution — Reifying efficiently Arash Rouhani – Thesis presentation 29/32

slide-63
SLIDE 63

One idea

  • Internally, the execution stack is a chunked linked list.
  • What if we freeze the stack and continue our stack in a new

chunk?

  • stop frame

___ frame (old) catch frame crash frame ____ frame (old) ____ frame (old) stop frame ___ frame (old) catch frame crash frame ____ frame (old) ____ frame (old) ____ frame (new) ____ frame (new) ____ frame (new)

Contribution — Reifying efficiently Arash Rouhani – Thesis presentation 29/32

slide-64
SLIDE 64

Why an Haskell interface?

  • Compare
  • gdb style of stack traces
  • Catching an exception with the stack trace

Contribution — Haskell interface Arash Rouhani – Thesis presentation 30/32

slide-65
SLIDE 65

Why an Haskell interface?

  • Compare
  • gdb style of stack traces
  • Catching an exception with the stack trace
  • The latter is much more powerful since we have control over it

in Haskell land

Contribution — Haskell interface Arash Rouhani – Thesis presentation 30/32

slide-66
SLIDE 66

Why an Haskell interface?

  • Compare
  • gdb style of stack traces
  • Catching an exception with the stack trace
  • The latter is much more powerful since we have control over it

in Haskell land

  • We can:
  • Print to screen
  • Email it
  • Choose to handle the exception based on if frame X is present
  • n

Contribution — Haskell interface Arash Rouhani – Thesis presentation 30/32

slide-67
SLIDE 67

Why an Haskell interface?

  • Compare
  • gdb style of stack traces
  • Catching an exception with the stack trace
  • The latter is much more powerful since we have control over it

in Haskell land

  • We can:
  • Print to screen
  • Email it
  • Choose to handle the exception based on if frame X is present
  • n
  • Definitely a requirement for software running in production

Contribution — Haskell interface Arash Rouhani – Thesis presentation 30/32

slide-68
SLIDE 68

The final Haskell API

  • Meh

Contribution — Haskell interface Arash Rouhani – Thesis presentation 31/32

slide-69
SLIDE 69

Final remarks

  • It seems possible to create an efficient first-class value of the

execution stack that is available post mortem. If my ideas work out this will be amazing

  • This work will not be so super-useful unless it incorporates

with exceptions that Haskell is not aware of, like segmentation

  • faults. Think foreign function calls and Haskell code like:

unsafeWrite v 1000000000 (0 :: Int)

Conclusion Arash Rouhani – Thesis presentation 32/32