diff --git a/libraries/ghc-internal/src/GHC/Internal/Conc/Signal.hs b/libraries/ghc-internal/src/GHC/Internal/Conc/Signal.hs
index 9d9da660c1fad5e6ebfb2be892b8fbbfa583cc93..59265201b874a2ca944b8a26465cea9a4290feed 100644
--- a/libraries/ghc-internal/src/GHC/Internal/Conc/Signal.hs
+++ b/libraries/ghc-internal/src/GHC/Internal/Conc/Signal.hs
@@ -19,7 +19,7 @@ import GHC.Internal.Foreign.Ptr (Ptr, castPtr)
 import GHC.Internal.Foreign.Marshal.Alloc (finalizerFree)
 import GHC.Internal.Arr (inRange)
 import GHC.Internal.Base
-import GHC.Internal.Conc.Sync (forkIO)
+import GHC.Internal.Conc.Sync (myThreadId, labelThread, forkIO)
 import GHC.Internal.IO (mask_, unsafePerformIO)
 import GHC.Internal.IOArray (IOArray, boundsIOArray, newIOArray,
                     unsafeReadIOArray, unsafeWriteIOArray)
@@ -69,7 +69,10 @@ runHandlers p_info sig = do
       else do handler <- unsafeReadIOArray arr int
               case handler of
                 Nothing -> return ()
-                Just (f,_)  -> do _ <- forkIO (f p_info)
+                Just (f,_)  -> do _ <- forkIO $ do
+                                    tid <- myThreadId
+                                    labelThread tid "signal handler"
+                                    f p_info
                                   return ()
 
 -- It is our responsibility to free the memory buffer, so we create a