[GHC] #14825: Access violation on Windows is not propagated to the OS

GHC ghc-devs at haskell.org
Mon Feb 19 21:17:34 UTC 2018


#14825: Access violation on Windows is not propagated to the OS
-------------------------------------+-------------------------------------
        Reporter:  varosi            |                Owner:  (none)
            Type:  feature request   |               Status:  closed
        Priority:  normal            |            Milestone:
       Component:  Runtime System    |              Version:  8.2.2
      Resolution:  duplicate         |             Keywords:
Operating System:  Windows           |         Architecture:  x86_64
 Type of failure:  Debugging         |  (amd64)
  information is incorrect           |            Test Case:
      Blocked By:                    |             Blocking:
 Related Tickets:  #13911            |  Differential Rev(s):
       Wiki Page:                    |
-------------------------------------+-------------------------------------
Changes (by Phyx-):

 * status:  new => closed
 * resolution:   => duplicate
 * related:   => #13911


Comment:

 Hi,

 I'm closing this as a dupe.

 Couple of things however:

 > The correct way on Windows is such exceptions to be propagated to the
 operating system.

 No it's not. An application is perfectly fine handling it's own
 exceptions. That's why the OS makes a distinction between `Unhandled` and
 `Handled` exceptions.

 > This way we will attach a debugger to the process and it'll get and
 visualize where the exception happened.

 This is also not accurate, first chance exceptions are always handled
 before all user exception handlers. GHC uses `VEH` handlers up to 8.4 and
 from then on `VCH`.

 The documentation clearly states `Vectored handlers are called in the
 order that they were added, after the debugger gets a first chance
 notification, but before the system begins unwinding the stack.` (see
 https://msdn.microsoft.com/en-
 us/library/windows/desktop/ms681420(v=vs.85).aspx)

 If a debugger is attached, it will *always* get the first chance to handle
 exceptions! If it wants to.

 For instance

 {{{
 module Main where

 import Foreign

 main :: IO ()
 main = do x <- peek nullPtr
           print (x :: Int)
 }}}

 compiling and attaching a debugger

 {{{
 Tamar at Rage ~/ghc2> ghc noexception.hs -fforce-recomp
 [1 of 1] Compiling Main             ( noexception.hs, noexception.o )
 Linking noexception.exe ...

 Tamar at Rage ~/ghc2> gdb --ex r --args noexception.exe
 GNU gdb (GDB) 7.11.1
 Copyright (C) 2016 Free Software Foundation, Inc.
 License GPLv3+: GNU GPL version 3 or later
 <http://gnu.org/licenses/gpl.html>
 This is free software: you are free to change and redistribute it.
 There is NO WARRANTY, to the extent permitted by law.  Type "show copying"
 and "show warranty" for details.
 This GDB was configured as "x86_64-pc-msys".
 Type "show configuration" for configuration details.
 For bug reporting instructions, please see:
 <http://www.gnu.org/software/gdb/bugs/>.
 Find the GDB manual and other documentation resources online at:
 <http://www.gnu.org/software/gdb/documentation/>.
 For help, type "help".
 Type "apropos word" to search for commands related to "word"...
 Traceback (most recent call last):
   File "<string>", line 3, in <module>
 ImportError: No module named libstdcxx.v6.printers
 /etc/gdbinit:6: Error in sourced command file:
 Error while executing Python code.
 Reading symbols from noexception.exe...done.
 Starting program: /home/Tamar/ghc2/noexception.exe
 [New Thread 47004.0x7284]
 [New Thread 47004.0xb4ac]
 [New Thread 47004.0x5580]
 [New Thread 47004.0x9d40]
 [New Thread 47004.0x1b38]

 Thread 1 received signal SIGSEGV, Segmentation fault.
 0x0000000000402879 in c6BK_info ()
 (gdb)
 }}}

 as you can see the debugger clearly breaks.

 {{{
 Tamar at Rage~/ghc2> ./noexception.exe
 Segmentation fault/access violation in generated code
 }}}

 without the debugger the exception handler runs.

 > Currently GHC runtime is catching the exception, skip its source
 information and present that uninformative message to the user.

 The reason the error is uninformative is because the location of your
 segfault occurred in a location for which there is no source information.
 The Haskell compiler can only emit DWARF at best so debugging is just more
 difficult on Windows.

 When running in ghci GHC 8.4 and newer will attempt to reconstruct a
 stack. It will also allow you to opt out of exception handling all
 together.

 For older (and compatible with newer) GHCs you can reasonably easily opt-
 out using FFI:

 {{{
 module Main where

 import Foreign

 foreign import ccall "__unregister_hs_exception_handler"
 disableExceptionHandler :: IO ()

 main :: IO ()
 main = do disableExceptionHandler
           x <- peek nullPtr
           print (x :: Int)
 }}}

 and you clearly get a second chance exception now

 {{{
 Tamar at Rage ~/ghc2> ./noexception.exe
 fish: “./noexception.exe” terminated by signal SIGSEGV (Address boundary
 error)
 }}}


 This isn't supported, but it's an easy way to disable the handling on
 older compilers.

-- 
Ticket URL: <http://ghc.haskell.org/trac/ghc/ticket/14825#comment:2>
GHC <http://www.haskell.org/ghc/>
The Glasgow Haskell Compiler


More information about the ghc-tickets mailing list