使用 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,因为 localtime
或 gettimeofday
存在问题。您得到地址 0x08 而不是 0x00,因为编译器试图将 8 个字节的值读入结构中。
【讨论】:
我觉得也是这个原因,但是我需要看时间...谢谢回复!【参考方案4】:成员tv.tv_sec
的类型是long
,但localtime
需要time_t *
参数。在 VC6 中这是可行的,因为 long
和 time_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”?