程序里经常放很多ASSERT,这样调试会很方便。以前很反感这个东西,觉得占用行数而且又很无谓(无知啊),但现在是很喜欢,动不动就来个ASSERT,有点过火了,哈哈。
如果ASSERT是放在一个函数里,当程序运行出错时弹个对话框给予提醒,但却令人一头雾水,到底是谁调用此函数导致出错呢?如果VC有个功能告诉我ASSERT出错之到底执行了什么代码那该多好啊。
以往我常常是从程序开头设置多几个可以断点,一步一步调试,缩小出错范围直到找到导致这个ASSERT的地方。但很烦,有时甚至不知如何下手。就知道出错在哪一行,可又查不出原因,很无奈。
今天突然有个想法。我们为什么不可以在ASSERT代码之前加个if判断,在if体内直接return(return要设置断点)。这样就可以马上知道是谁调用了此函数了。比如函数:
void func(int k)
{
ASSERT(k!=0); int a=4;
//其它代码
}现在我们知道ASSERT(k!=0);出错了。那我们改成:void func(int k)
{
//判断形式为 if(!( X )) 《 X 为ASSERT()里面的表达式》
if (!(k!=0))
{
//return添加断点,调试到这里函数返回就可以
//跟踪到是谁调用了此函数。
/*设置断点*/ return;
} ASSERT(k!=0); int a=4;
//其它代码
}当k==0 时程序跳到return,再按step over 很快就可以跳出函数体并且跟踪到是谁调用此函数导致出错了。以上是一点心得,愿和大家分享。如果大家有更好的方法,请多多指教,谢谢!
如果ASSERT是放在一个函数里,当程序运行出错时弹个对话框给予提醒,但却令人一头雾水,到底是谁调用此函数导致出错呢?如果VC有个功能告诉我ASSERT出错之到底执行了什么代码那该多好啊。
以往我常常是从程序开头设置多几个可以断点,一步一步调试,缩小出错范围直到找到导致这个ASSERT的地方。但很烦,有时甚至不知如何下手。就知道出错在哪一行,可又查不出原因,很无奈。
今天突然有个想法。我们为什么不可以在ASSERT代码之前加个if判断,在if体内直接return(return要设置断点)。这样就可以马上知道是谁调用了此函数了。比如函数:
void func(int k)
{
ASSERT(k!=0); int a=4;
//其它代码
}现在我们知道ASSERT(k!=0);出错了。那我们改成:void func(int k)
{
//判断形式为 if(!( X )) 《 X 为ASSERT()里面的表达式》
if (!(k!=0))
{
//return添加断点,调试到这里函数返回就可以
//跟踪到是谁调用了此函数。
/*设置断点*/ return;
} ASSERT(k!=0); int a=4;
//其它代码
}当k==0 时程序跳到return,再按step over 很快就可以跳出函数体并且跟踪到是谁调用此函数导致出错了。以上是一点心得,愿和大家分享。如果大家有更好的方法,请多多指教,谢谢!
一般是调用堆栈
可以按<Alt+7>