程序以服务形式启动断言异常分析

前言

        程序以服务的形式启动,遇到断言vector subscript out of range,会产生两种情况

1)在线程中遇到断言错误,该线程会停止,但是主线程不受影响

2)主线程遇到断言错误,程序直接退出,不会弹窗,提示断言错误,如果服务是以自动形式启动,将会自动重新启动。


测试代码

  std::vector<int> vecTest;
  for (int i = 0; i <= vecTest.size(); i++)
  {
   std::cout << vecTest[3] << std::endl;
  }
 reference operator[](size_type _Pos)
  { // subscript mutable sequence
 #if _ITERATOR_DEBUG_LEVEL == 2
  if (size() <= _Pos)
   { // report error
   _DEBUG_ERROR("vector subscript out of range");
   _SCL_SECURE_OUT_OF_RANGE;
   }

Debug 和 Release 的真正区别,在于一组编译选项。
Debug 版本  
参数       含义  
/MDd /MLd 或 /MTd 使用 Debug runtime library(调试版本的运行时刻函数库)  
/Od 关闭优化开关  
/D "_DEBUG" 相当于 #define _DEBUG,打开编译调试代码开关(主要针对assert函数)  
/ZI  
创建 Edit and continue(编辑继续)数据库,这样在调试过程中如果修改了源代码不需重新编译  
GZ 可以帮助捕获内存错误 
  
Release 版本 参数含义  
/MD /ML 或 /MT 使用发布版本的运行时刻函数库  
/O1 或 /O2 优化开关,使程序最小或最快  
/D "NDEBUG" 关闭条件编译调试代码开关(即不编译assert函数)  
/GF 合并重复的字符串,并将字符串常量放到只读内存,防止被修改 

/GZ 选项:这个选项会做以下这些事: 1.  初始化内存和变量。包括用 0xCC 初始化所有自动变量,0xCD ( Cleared Data ) 初始化堆中分配的内存(即动态分配的内存,例如 new ),0xDD ( Dead Data ) 填充已被释放的堆内存(例如 delete ),0xFD( deFencde Data ) 初始化受保护的内存(debug 版在动态分配内存的前后加入保护内存以防止越界访问),其中括号中的词是微软建议的助记词。这样做的好处是这些值都很大,作为指针是不可能的(而且 32 位系统中指针很少是奇数值,在有些系统中奇数的指针会产生运行时错误),作为数值也很少遇到,而且这些值也很容易辨认,因此这很有利于在 Debug 版中发现 Release 版才会遇到的错误。要特别注意的是,很多人认为编译器会用 0 来初始化变量,这是错误的(而且这样很不利于查找错误)。




猜你喜欢

转载自blog.51cto.com/fengyuzaitu/2514437
今日推荐