--- a/cmajor++/Cm/Cm.Debugger/DebugInfo.cpp
+++ b/cmajor++/Cm/Cm.Debugger/DebugInfo.cpp
@@ -87,8 +87,15 @@
 
 SourceFileLine SourcePos::FunCallCFileLine() const
 {
-    const Cm::Core::CFunCall& f = node->CFunCalls()[funIndex];
-    return SourceFileLine(Fun()->File()->CFilePath(), f.CLine());
+    if (funIndex >= 0)
+    {
+        const Cm::Core::CFunCall& f = node->CFunCalls()[funIndex];
+        return SourceFileLine(Fun()->File()->CFilePath(), f.CLine());
+    }
+    else
+    {
+        return SourceFileLine();
+    }
 }
 
 std::string SourcePos::ToString() const
@@ -492,7 +499,23 @@
 
 void DebugInfo::AddBreakpoint(BreakpointPtr bp)
 {
-    if (bp->Kind() == BreakpointKind::temp)
+    if (bp->Kind() == BreakpointKind::user)
+    {
+        SourceFileLineBreakpointMapIt i = sourceFileLineBreakpointMap.find(bp->Pos().FileLine());
+        if (i != sourceFileLineBreakpointMap.cend())
+        {
+            bp->SetHidden(i->second);
+        }
+    }
+    else if (bp->Kind() == BreakpointKind::temp)
+    {
+        SourceFileLineBreakpointMapIt i = sourceFileLineBreakpointMap.find(bp->Pos().FileLine());
+        if (i != sourceFileLineBreakpointMap.cend())
+        {
+            bp->SetHidden(i->second);
+        }
+    }
+    else if (bp->Kind() == BreakpointKind::throw_)
     {
         SourceFileLineBreakpointMapIt i = sourceFileLineBreakpointMap.find(bp->Pos().FileLine());
         if (i != sourceFileLineBreakpointMap.cend())
@@ -506,16 +529,22 @@
         sourceFileLineBreakpointMap[bp->Pos().FileLine()] = bp;
         gdbBreakpoints[bp->GdbBp()] = bp;
     }
-    else // temporary
+    else if (bp->Kind() == BreakpointKind::temp)
     {
         tempBreakpoints[bp->Number()] = bp;
         gdbBreakpoints[bp->GdbBp()] = bp;
     }
+    else if (bp->Kind() == BreakpointKind::throw_)
+    {
+        throwBreakpoints[bp->Number()] = bp;
+        sourceFileLineBreakpointMap[bp->Pos().FileLine()] = bp;
+        gdbBreakpoints[bp->GdbBp()] = bp;
+    }
 }
 
 BreakpointPtr DebugInfo::GetBreakpoint(int bp)
 {
-    BreapointMapIt i = userBreakpoints.find(bp);
+    BreakpointMapIt i = userBreakpoints.find(bp);
     if (i != userBreakpoints.cend())
     {
         return i->second;
@@ -526,28 +555,65 @@
 void DebugInfo::RemoveBreakpoint(BreakpointPtr bp)
 {
     if (bp->Kind() == BreakpointKind::user)
-    {
-        userBreakpoints.erase(bp->Number());
-        sourceFileLineBreakpointMap.erase(bp->Pos().FileLine());
-        gdbBreakpoints.erase(bp->GdbBp());
-    }
-    else // temporary
     {
         BreakpointPtr hidden = bp->Hidden();
         if (hidden)
         {
-            userBreakpoints[hidden->Number()] = hidden;
+            if (hidden->Kind() == BreakpointKind::throw_)
+            {
+                throwBreakpoints[hidden->Number()] = hidden;
+            }
             sourceFileLineBreakpointMap[hidden->Pos().FileLine()] = hidden;
         }
         else
         {
             gdbBreakpoints.erase(bp->GdbBp());
+            sourceFileLineBreakpointMap.erase(bp->Pos().FileLine());
+        }
+        userBreakpoints.erase(bp->Number());
+    }
+    else if (bp->Kind() == BreakpointKind::throw_)
+    {
+        BreakpointPtr hidden = bp->Hidden();
+        if (hidden)
+        {
+            if (hidden->Kind() == BreakpointKind::user)
+            {
+                userBreakpoints[hidden->Number()] = hidden;
+            }
+            sourceFileLineBreakpointMap[hidden->Pos().FileLine()] = hidden;
+        }
+        else
+        {
+            gdbBreakpoints.erase(bp->GdbBp());
+            sourceFileLineBreakpointMap.erase(bp->Pos().FileLine());
+        }
+        throwBreakpoints.erase(bp->Number());
+    }
+    else if (bp->Kind() == BreakpointKind::temp)
+    {
+        BreakpointPtr hidden = bp->Hidden();
+        if (hidden)
+        {
+            if (hidden->Kind() == BreakpointKind::user)
+            {
+                userBreakpoints[hidden->Number()] = hidden;
+            }
+            else if (hidden->Kind() == BreakpointKind::throw_)
+            {
+                throwBreakpoints[hidden->Number()] = hidden;
+            }
+            sourceFileLineBreakpointMap[hidden->Pos().FileLine()] = hidden;
+        }
+        else
+        {
+            gdbBreakpoints.erase(bp->GdbBp());
         }
         tempBreakpoints.erase(bp->Number());
     }
 }
 
-BreakpointVec DebugInfo::GetBreakpoints() const
+BreakpointVec DebugInfo::GetUserBreakpoints() const
 {
     BreakpointVec bps;
     for (const std::pair<int, BreakpointPtr>& bp : userBreakpoints)
@@ -557,6 +623,16 @@
     return bps;
 }
 
+BreakpointVec DebugInfo::GetThrowBreakpoints() const
+{
+    BreakpointVec bps;
+    for (const std::pair<int, BreakpointPtr>& bp : throwBreakpoints)
+    {
+        bps.push_back(bp.second);
+    }
+    return bps;
+}
+
 BreakpointPtr DebugInfo::GetBreakpoint(const SourceFileLine& sfl) const
 {
     SourceFileLineBreakpointMapIt i = sourceFileLineBreakpointMap.find(sfl);
@@ -588,7 +664,7 @@
 
 BreakpointPtr DebugInfo::GetGdbBreakpoint(int gdbbp)
 {
-    BreapointMapIt i = gdbBreakpoints.find(gdbbp);
+    BreakpointMapIt i = gdbBreakpoints.find(gdbbp);
     if (i != gdbBreakpoints.end())
     {
         return i->second;