使用 Visual C++ 2008 时如何解决未处理的异常错误?

Posted

技术标签:

【中文标题】使用 Visual C++ 2008 时如何解决未处理的异常错误?【英文标题】:how to solve unhandled exception error when using visual C++ 2008? 【发布时间】:2010-03-22 06:57:13 【问题描述】:

在使用 Visual C++ 2008 时,有人可以帮我解决未处理的异常错误吗?错误显示如下: time.exe 中 0x00411690 处的未处理异常:0xC0000005:访问冲突读取位置 0x00000008

一些细节: - tm 0x00000000 tm_sec=??? tm_min=??? tm_hour=??? ... tm * tm_sec CXX0030:错误:无法评估表达式 ...

其实我过去使用visual c++ 6的时候,并没有出现任何错误,程序运行良好。但是现在当我使用 Visual 2008 时,我得到了这个未处理的异常错误。

这是程序:

...
int gettimeofday(struct timeval *tv, struct timezone *tz)

  FILETIME ft;
  unsigned __int64 tmpres = 0;
  static int tzflag = 0;

  if (NULL != tv)
  
    GetSystemTimeAsFileTime(&ft);

    tmpres |= ft.dwHighDateTime;
    tmpres <<= 32;
    tmpres |= ft.dwLowDateTime;

    tmpres /= 10;  /*convert into microseconds*/
    /*converting file time to unix epoch*/
    tmpres -= DELTA_EPOCH_IN_MICROSECS; 
    tv->tv_sec = (long)(tmpres / 1000000UL);
    tv->tv_usec = (long)(tmpres % 1000000UL);
  

  if (NULL != tz)
  
    if (!tzflag)
    
      _tzset();
      tzflag++;
    
    tz->tz_minuteswest = _timezone / 60;
    tz->tz_dsttime = _daylight;
  

  return 0;



uint32_t stampstart()

 struct timeval  tv;
 struct timezone tz;
 struct tm      *tm;
 uint32_t         start;

 gettimeofday(&tv, &tz);
 tm = localtime(&tv.tv_sec);

 printf("TIMESTAMP-START\t  %d:%02d:%02d:%d (~%d ms)\n", tm->tm_hour,
        tm->tm_min, tm->tm_sec, tv.tv_usec,
        tm->tm_hour * 3600 * 1000 + tm->tm_min * 60 * 1000 +
        tm->tm_sec * 1000 + tv.tv_usec / 1000);   /////---debugger stops here---

 start = tm->tm_hour * 3600 * 1000 + tm->tm_min * 60 * 1000 +
  tm->tm_sec * 1000 + tv.tv_usec / 1000;

 return (start);


感谢您的回复:

【问题讨论】:

使用 Visual Studio 调试器,单步执行代码,告诉我们异常发生在哪里... 您在哪一行收到此异常...? 感谢您的回复...见行:tm->tm_sec * 1000 + tv.tv_usec / 1000); uint32_t stampstart() 函数 问题是变量“tv.tv_sec”返回一个负值。为什么?有什么想法吗?谢谢 看看这里:***.com/questions/2494356/… 【参考方案1】:

尝试类似...

 tm = localtime(&tv.tv_sec);
if(tm)

 printf("TIMESTAMP-START\t  %d:%02d:%02d:%d (~%d ms)\n", tm->tm_hour,
        tm->tm_min, tm->tm_sec, tv.tv_usec,
        tm->tm_hour * 3600 * 1000 + tm->tm_min * 60 * 1000 +
        tm->tm_sec * 1000 + tv.tv_usec / 1000); 

 start = tm->tm_hour * 3600 * 1000 + tm->tm_min * 60 * 1000 +
  tm->tm_sec * 1000 + tv.tv_usec / 1000;

else

 // failed to retrive local time

【讨论】:

感谢您的想法。是的!它无法检索本地时间。有没有办法解决这个问题?再次感谢您的帮助 您可以看到 errno 的确切问题...如果 localtime() 失败,它将设置 errno ... 是的!它是本地时间,因为它不会返回任何想法。实际上我不明白为什么它适用于 VC++6 而不是 VC++2008 ...谢谢!【参考方案2】:

访问冲突是指地址 0x00000008,这可能意味着您的代码正在访问您使用 NULL 指针指向的结构中偏移量 8 处的字段。 我猜 localtime 返回一个 NULL 指针。检查一下。

【讨论】:

可能,但为什么它适用于 VC++6 而不适用于 VC++2008?感谢您的回复!【参考方案3】:

“访问冲突读取位置0x00000008”

这么低的地址可能是由访问空指针引起的。在这种情况下,tm 可能是 0,因为 localtimegettimeofday 存在问题。您得到地址 0x08 而不是 0x00,因为编译器试图将 8 个字节的值读入结构中。

【讨论】:

我觉得也是这个原因,但是我需要看时间...谢谢回复!【参考方案4】:

成员tv.tv_sec 的类型是long,但localtime 需要time_t * 参数。在 VC6 中这是可行的,因为 longtime_t 都是 32 位的,但在 VS2008 中 time_t 是 64 位类型,因此它们不兼容。

这应该可以解决它:

//add to beginning of stampstart function:
time_t t;

//... other code...

//put this instead of call to localtime:
t = tv.tv_sec;
tm = localtime(&t);

【讨论】:

其实我已经试过了:tm = localtime((time_t *) &tv.tv_sec);并且仍然得到相同的错误(异常处理)...... @make:我忘了这是C,所以变量必须在函数开头声明。我编辑了我的答案以显示这一点。至于您的第二条评论,将其转换为 time_t* 将无济于事,因为它没有实际的 time_t 指向。 谢谢!是的,您是对的,正如我在回复您的消息后才想起的那样,它是 C。是的!我也试过了,但仍然出现同样的错误......任何其他想法......再次感谢您的帮助 @make:“同样的错误”是指 C2275 还是访问冲突? 我的意思是未处理的异常......这是一个副本:tim.exe 中 0x0041166a 的第一次机会异常:0xC0000005:访问冲突读取位置 0x00000008。 tim.exe 中 0x0041166a 处未处理的异常:0xC0000005:访问冲突读取位置 0x00000008。【参考方案5】:

有了那个地址,我的 SWAG 就是 tm 为 NULL。由于您在调用 localtime() 后从不检查 NULL,因此您取消了对 NULL 指针的引用。

编辑:SWAG = Scientific Wild Ass Guess。

地址 0x00000008 与 tm.tm_hour 的偏移量相同。当您将参数传递给 printf() 时,您正在尝试访问 tm->tm_hour。

【讨论】:

你在说哪个赃物......?运行可执行文件时出现错误。程序编译和链接没有错误。但是当我执行它时,我得到了未处理的异常......感谢您的回复! "Specific while ass guess" :) 它会编译干净,因为编译器无法知道tm 在您运行程序时最终会为空。在您执行之前不会发生这种情况。 感谢您的回复。实际上我没有使用 Visual C++ 的经验,这是我第一次听说 SWAG。所以请解释并告诉我如何使用来解决这个问题......再次感谢【参考方案6】:

要捕获这种异常,需要对项目进行小幅调整。只需在项目设置中启用 /EHa 选项。请参阅项目属性 -> C/C++ -> 代码生成 -> 将 Enable C++ Exceptions 修改为“Yes With SEH Exceptions”。就是这样!

在此处查看详细信息: http://msdn.microsoft.com/en-us/library/1deeycx5(v=vs.80).aspx

【讨论】:

以上是关于使用 Visual C++ 2008 时如何解决未处理的异常错误?的主要内容,如果未能解决你的问题,请参考以下文章

Visual Studio 2008 发布版本上的 c++ 应用程序出现未处理异常 - 从函数返回时发生

MongoDB 和 Visual C++ 2008 链接器错误

装Kingbase ES V7时为啥依赖检测时,总是提示我说Microsoft Visual C++ 2008未通过检测???

如何在 vc 2008 上使用“Visual C++ 2008 Feature Pack”?

如何使用 Microsoft Visual C++ 2008 编译 PHP 扩展?

C++ Visual Studio 2008 中未声明的标识符