diff -ur aspell-0.60.7-20110707.orig/common/config.cpp aspell-0.60.7-20110707/common/config.cpp
--- aspell-0.60.7-20110707.orig/common/config.cpp	2014-03-20 22:31:38.359557900 +0000
+++ aspell-0.60.7-20110707/common/config.cpp	2014-03-20 22:39:19.296089400 +0000
@@ -617,7 +630,7 @@
 
       } else {
       
-	abort(); // this should not happen
+	DebugBreak(); // this should not happen
       
       }
     
@@ -837,7 +865,7 @@
         case ListClear:
           return make_err(no_value_clear, entry->key);
         default:
-          abort(); // this shouldn't happen
+          DebugBreak(); // this shouldn't happen
         }
       } else {
         entry->place_holder = -1;
diff -ur aspell-0.60.7-20110707.orig/common/itemize.cpp aspell-0.60.7-20110707/common/itemize.cpp
--- aspell-0.60.7-20110707.orig/common/itemize.cpp	2004-01-03 12:06:24.000000000 +0000
+++ aspell-0.60.7-20110707/common/itemize.cpp	2014-03-20 22:39:22.191457100 +0000
@@ -97,7 +97,7 @@
 	RET_ON_ERR(d.clear());
 	break;
       default:
-	abort();
+	DebugBreak();
       }
     }
     return no_err;
diff -ur aspell-0.60.7-20110707.orig/common/posib_err.cpp aspell-0.60.7-20110707/common/posib_err.cpp
--- aspell-0.60.7-20110707.orig/common/posib_err.cpp	2004-11-21 02:52:22.000000000 +0000
+++ aspell-0.60.7-20110707/common/posib_err.cpp	2014-03-20 22:39:24.232716300 +0000
@@ -114,7 +114,7 @@
     fputs(_("Unhandled Error: "), stderr);
     fputs(err_->err->mesg, stderr);
     fputs("\n", stderr);
-    abort();
+    DebugBreak();
   }
 #endif
 
diff -ur aspell-0.60.7-20110707.orig/common/string_list.hpp aspell-0.60.7-20110707/common/string_list.hpp
--- aspell-0.60.7-20110707.orig/common/string_list.hpp	2004-06-17 12:41:47.000000000 +0000
+++ aspell-0.60.7-20110707/common/string_list.hpp	2014-03-20 22:39:26.609018100 +0000
@@ -90,7 +90,7 @@
     }
 
     bool empty() const { return first == 0; }
-    unsigned int size() const { abort(); return 0; }
+    unsigned int size() const { DebugBreak(); return 0; }
 
   };
 
diff -ur aspell-0.60.7-20110707.orig/modules/speller/default/data.cpp aspell-0.60.7-20110707/modules/speller/default/data.cpp
--- aspell-0.60.7-20110707.orig/modules/speller/default/data.cpp	2011-07-04 14:30:16.000000000 +0000
+++ aspell-0.60.7-20110707/modules/speller/default/data.cpp	2014-03-20 22:39:33.647911900 +0000
@@ -441,7 +442,7 @@
         w = new_default_replacement_dict(config);
         break;
       default:
-        abort();
+        DebugBreak();
       }
 
       RET_ON_ERR(w->load(true_file_name, config, new_dicts, speller));
diff -ur aspell-0.60.7-20110707.orig/modules/speller/default/phonetic.cpp aspell-0.60.7-20110707/modules/speller/default/phonetic.cpp
--- aspell-0.60.7-20110707.orig/modules/speller/default/phonetic.cpp	2004-05-21 00:15:58.000000000 +0000
+++ aspell-0.60.7-20110707/modules/speller/default/phonetic.cpp	2014-03-20 22:39:36.033214800 +0000
@@ -194,7 +194,7 @@
     } else if (name == lang->name()) {
       sl = new PhonetSoundslike(lang);
     } else {
-      abort(); // FIXME
+      DebugBreak(); // FIXME
     }
     PosibErrBase pe = sl->setup(iconv);
     if (pe.has_err()) {
diff -ur aspell-0.60.7-20110707.orig/modules/speller/default/readonly_ws.cpp aspell-0.60.7-20110707/modules/speller/default/readonly_ws.cpp
--- aspell-0.60.7-20110707.orig/modules/speller/default/readonly_ws.cpp	2011-07-04 22:00:38.000000000 +0000
+++ aspell-0.60.7-20110707/modules/speller/default/readonly_ws.cpp	2014-03-20 22:39:39.614669600 +0000
@@ -108,7 +108,7 @@
 
 static inline void mmap_free(char *, unsigned int) 
 {
-  abort();
+  DebugBreak();
 }
 
 #endif
@@ -210,7 +210,7 @@
       InsensitiveHash<hash_int_t> hash;
       InsensitiveEqual equal;
       bool is_nonexistent(Value v) const {return v == u32int_max;}
-      void make_nonexistent(const Value & v) const {abort();}
+      void make_nonexistent(const Value & v) const {DebugBreak();}
     };
     typedef VectorHashTable<WordLookupParms> WordLookup;
 
diff -ur aspell-0.60.7-20110707.orig/modules/speller/default/speller_impl.cpp aspell-0.60.7-20110707/modules/speller/default/speller_impl.cpp
--- aspell-0.60.7-20110707.orig/modules/speller/default/speller_impl.cpp	2011-07-04 14:30:16.000000000 +0000
+++ aspell-0.60.7-20110707/modules/speller/default/speller_impl.cpp	2014-03-20 22:39:43.524666100 +0000
@@ -473,7 +473,7 @@
     static PosibErr<void> save_repl(SpellerImpl * m, bool value) {
       // FIXME
       // m->save_on_saveall(DataSet::Id(&m->personal_repl()), value);
-      abort(); return no_err;
+      DebugBreak(); return no_err;
     }
     static PosibErr<void> sug_mode(SpellerImpl * m, const char * mode) {
       RET_ON_ERR(m->suggest_->set_mode(mode));
@@ -813,7 +813,7 @@
     case Dict::multi_dict:
       break;
     default:
-      abort();
+      DebugBreak();
     }
     save_on_saveall = false;
   }
@@ -839,7 +839,7 @@
         
       } else {
         
-        abort();
+        DebugBreak();
         
       }
       break;
diff -ur aspell-0.60.7-20110707.orig/prog/aspell.cpp aspell-0.60.7-20110707/prog/aspell.cpp
--- aspell-0.60.7-20110707.orig/prog/aspell.cpp	2014-03-20 22:31:38.247543700 +0000
+++ aspell-0.60.7-20110707/prog/aspell.cpp	2014-03-20 22:39:47.708697400 +0000
@@ -448,7 +451,7 @@
   else if (action_str == "merge")
     action = do_merge;
   else
-    abort(); // this should not happen
+    DebugBreak(); // this should not happen
 
   if (action != do_other) {
     if (args.empty()) {
@@ -1520,7 +1523,7 @@
     }
     break;
   default:
-    abort();
+    DebugBreak();
   }
 }
 
--- aspell-0.60.7-20110707/modules/filter/tex.cpp.orig	2011-06-26 00:30:51.000000000 +0000
+++ aspell-0.60.7-20110707/modules/filter/tex.cpp	2014-03-21 00:05:17.545103900 +0000
@@ -24,6 +24,7 @@
 #include "string_enumeration.hpp"
 
 #include "gettext.h"
+#include <debugapi.h>
 
 namespace {
 
--- aspell-0.60.7-20110707/common/itemize.cpp.orig	2014-03-20 22:41:17.483097300 +0000
+++ aspell-0.60.7-20110707/common/itemize.cpp	2014-03-21 00:05:47.254376500 +0000
@@ -12,6 +12,7 @@
 #include "mutable_container.hpp"
 #include <stdio.h>
 #include <cstdio>
+#include <debugapi.h>
 
 //FIXME: it should be possible to escape ',' '+' '-' '!' so that they can
 //       appear in values
--- aspell-0.60.7-20110707/common/string_list.hpp.orig	2014-03-20 22:41:17.485097500 +0000
+++ aspell-0.60.7-20110707/common/string_list.hpp	2014-03-21 00:06:43.069964200 +0000
@@ -12,6 +12,7 @@
 #include "posib_err.hpp"
 #include <stdio.h>
 #include <cstdio>
+#include <debugapi.h>
 
 namespace acommon {
 
--- aspell-0.60.7-20110707/common/posib_err.cpp.orig	2014-03-20 22:41:17.484097400 +0000
+++ aspell-0.60.7-20110707/common/posib_err.cpp	2014-03-21 00:07:22.355452800 +0000
@@ -13,7 +13,7 @@
 #include "posib_err.hpp"
 
 #include "gettext.h"
-
+#include <debugapi.h>
 
 namespace acommon {
 
--- aspell-0.60.7-20110707/modules/speller/default/readonly_ws.cpp.orig	2014-03-20 22:41:17.489598100 +0000
+++ aspell-0.60.7-20110707/modules/speller/default/readonly_ws.cpp	2014-03-21 00:08:00.899347200 +0000
@@ -55,6 +55,7 @@
 #include "iostream.hpp"
 
 #include "gettext.h"
+#include <debugapi.h>
 
 typedef unsigned int   u32int;
 static const u32int u32int_max = (u32int)-1;
--- aspell-0.60.7-20110707/modules/speller/default/data.cpp.orig	2014-03-20 22:41:17.487097800 +0000
+++ aspell-0.60.7-20110707/modules/speller/default/data.cpp	2014-03-21 00:12:01.247367600 +0000
@@ -17,6 +17,7 @@
 #include "vararray.hpp"
 
 #include "gettext.h"
+#include <debugapi.h>
 
 namespace aspeller {
 
--- aspell-0.60.7-20110707/modules/speller/default/phonetic.cpp.orig	2014-03-20 22:41:17.488097900 +0000
+++ aspell-0.60.7-20110707/modules/speller/default/phonetic.cpp	2014-03-21 00:12:31.846253100 +0000
@@ -7,6 +7,7 @@
 #include "file_util.hpp"
 #include "file_data_util.hpp"
 #include "clone_ptr-t.hpp"
+#include <debugapi.h>
 
 namespace aspeller {
   
