首页 - 信息 - vs2010显示代码出错位置_确切定位c++代码中异常抛出位置的两个方法 (以VS2010调试为例)

vs2010显示代码出错位置_确切定位c++代码中异常抛出位置的两个方法 (以VS2010调试为例)

2023-09-23 21:50

有时候程序crash了,但是不能定位具体的exception在哪里throw的(因为可能函数调用很深,并且有很多try--catch),举个简单的例子:

class Test { public: Test(int i) : m_i(i) {} void f() { cout << m_i << endl; throw new Test(6); } private: int m_i; }; void f1() { try { Test* pT = new Test(0); pT->f(); } catch (...) { cout << "exception is caught in f1!" << endl; throw; } }

void f2() { try { f1(); } catch (...) { cout << "exception is caught in f2!" << endl; throw; } }

int _tmain(int argc, _TCHAR* argv[]) { try { f2(); } catch (...) { cout << "exception is caught in main!" << endl; }

? ? ? ? return 0;

}

因为你一开始可能并不知道在哪里设breakpoints,所以F5以后,程序会直接stop到main()函数的最后一行,还是查不出具体的问题在哪里。有下面两个方法可以定位exception在哪里:

在VS的菜单Debug--->Exceptions中把一些exceptions打上勾(default一般都不勾),在上面这个特殊例子中,因为我throw了一个自己定义的exception类Test,所以需要把Test这个exception加入到Exceptions dialog中去(click "Add", 在New Exceptions dialog中Name设为"Test",就可以加入了,然后在Exceptions dialog中把Test这个exception勾上)。此时直接F5,程序会stop在f()中 “throw new Test(6);”这一行。(实际项目中根据实际情况,勾选相应的exceptions,如果全勾上,比较保险,但是会有很多不必要的exception会stop下来,根据经验,一般c++ project中,我只勾选Win32 Exceptions,如果不行,再勾选一些别的exceptions)将保护f2()的try--catch暂时去除(一般去除的是真正处理exception的那个try---catch,而不是中间过程的那些try---catch,因为中间过程很多的try---catch可能仅仅是把catch到exception重新throw到外层,而不是真正处理),然后F5,程序也会stop在f()中 “throw new Test(6);”这一行。 实际项目可以灵活应用这两个方法。

今天在学习C语言的时候,出现了一系列报错,如下图所示。

原因

产生此类错误的原因,是因为C语言在定义局部变量的时候,必须将局部变量定义在函数前面,或者局部空间的起始位置。C原因对局部变量的要求比较严格。

解决办法

1,第一个方法,将源文件的后缀名改为.cpp文件,因为在C++中可以随意定义变量,而.cpp是c++语言的源程序,c++兼容c语言的绝大部分语法特性。

2,第二个方法,找到变量定义的位置,将变量定义在函数的起始位置。

演示如下图所示

?错误提示

?解决办法

?

利用VS2010编译C语言代码,遇到的问题及解决方法如下:

1???error C2143: 语法错误 : 缺少“;”(在“类型”的前面)

解决方法:

原因:【C】error C2143: 语法错误 : 缺少“;”(在“类型”的前面)

实质上,纯c要求局部变量定义必须在函数或局部空间的开头,然后才能有其他语句。纯c确实对变量声明的位置有要求,c++却可以随用随定义的。 说明vs是严格执行了纯C的标准。变量任意定义是C99的标准。这是C89的标准,C99也没有这个限制。问题是微软拒绝支持C99(包括VS2012),一股当年IE6的作风。可以用/tp参数把程序作为C++代码编译,就可以通过了。或者,根本没有这么麻烦,将int b拉到最顶,就没事了。

就是要你完成所有局部变量的定义,你才能写代码。

?将局部变量的定义移动至函数开头即可。

?

2?“F_OK”: 未声明的标识符

解决方法:?

搜索关键词: F_OK,找到以下链接

access函数

模仿其代码,增加宏定义:

#define F_OK 0 /* Test for existence. */

?

3?无法解析的外部符号 localtime_r

localtime、localtime_s、localtime_r的使用

其中有以下:

localtime_r也是用来获取系统时间,运行于linux平台下。localtime_s也是用来获取系统时间,运行于windows平台下,与localtime_r只有参数顺序不一样

?localtime_r(&cur_time, &now);

改为?

localtime_s(&now,&cur_time);

并增加相应的头文件。

类似的还有将 sleep()改为Sleep。

C语言中的Sleep函数用法