debug时部分变量无法显示,

csoapy 2010-12-16 04:08:03
有新的情况要反应,但cSdN既不能编辑自己的帖子,回复又不能超过三次,所以我只好重发了,请管理员删除原帖:
http://topic.csdn.net/u/20101215/01/a595fbe9-6da6-4252-a0ab-d86d7a342911.html


debug时部分变量无法显示:


release和debug模式的运行结果不一致,debug模式下正常,release下gradesize 为 (0,0):


opencv的库用的时候debug和release模式要和应用程序的对应,不然imread("..\\Images\\test.bmp")之类的函数读不出数据。但我这里注意了这个地方:
#pragma once

#include "opencv2/core/core.hpp"
#include "opencv2/imgproc/imgproc.hpp"
#include "opencv2/objdetect/objdetect.hpp"

#ifdef _DEBUG
#pragma comment(lib, "opencv_core220d.lib")
#pragma comment(lib, "opencv_imgproc220d.lib")
#pragma comment(lib, "opencv_objdetect220d.lib")
#else
#pragma comment(lib, "opencv_core220.lib")
#pragma comment(lib, "opencv_imgproc220.lib")
#pragma comment(lib, "opencv_objdetect220.lib")
#endif

另外,vs2010的帮助菜单里面有个“报告 bug”但点了之后又是登录又是验证,转了一大圈最后把我带到了vs的英文主页上去了!这叫什么报告BUG?为何不能做得像opera浏览器那样点一下就可以提交?说ms个性化方面垃圾似乎冤枉它了,但这个bug反馈……
...全文
847 21 打赏 收藏 转发到动态 举报
写回复
用AI写文章
21 条回复
切换为时间正序
请发表友善的回复…
发表回复
cranium 2010-12-17
  • 打赏
  • 举报
回复
cranium 2010-12-17
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 csoapy 的回复:]

引用 12 楼 cranium 的回复:
可以的话,我希望可以得到一份代码。

这个没问题,就是麻烦一点:您还需要下载OpenCV2.2 for VS2010的安装包。安装完把include和lib路径设置一下的,我自己的是 D:\dev\OpenCV2.2

我的代码很简单的,只是把struct HOG继承了过来,重载了它一个computeGradient()的函数,函数内容也与基类……
[/Quote]

谢谢!邮件我已经收到了,经过近2个小时的摆弄(中间由于没有先看你的帖子就去搞opencv,结果在中文论坛上找了个2.1版的,还被告知是最新版 ,无奈重新来过- -!)

问题已经找到了! 可以确定这是vs2010的一个bug,几个月前已经有人提交此BUG到MS了,MS也回复说已经修复了此BUG,只等发布补丁了,不过几个月过去似乎也没有等到。

下面说说我的解决办法!

1、BUG的产生示例(经过多次尝试,这是一个最简的产生cxx0017错误的代码):

//不需要加任何头文件
int main()
{
float f = 123.0; //关键1,只去掉此处可以解决问题
if(false)
{
int i; //关键2,只去掉此处也可以解决问题
}
else
{
int a = 123;
a++; //设置断点 CXX0017 error.
}
return 0;
}


2、根据上面的实验,我对你的代码进行了下面的修改,之后一切OK了

if( cn == 1 )
{
for( x = 0; x < width; x++ )
{
//int x1 = xmap[x];
//dbuf[x] = (float)(lut[imgPtr[xmap[x+1]]] - lut[imgPtr[xmap[x-1]]]);
//dbuf[width + x] = (float)(lut[nextPtr[x1]] - lut[prevPtr[x1]]);
//取消int x1临时变量,直接使用xmap[x]
dbuf[x] = (float)(lut[imgPtr[xmap[x+1]]] - lut[imgPtr[xmap[x-1]]]);
dbuf[width + x] = (float)(lut[nextPtr[xmap[x]]] - lut[prevPtr[xmap[x]]]);
}
}



通过这种方式就可以解决问题了,剩下就完美方案就等MS的补丁了。
liugang9931706 2010-12-17
  • 打赏
  • 举报
回复
一般编译器的debug版本和release版本有所不同,debug版本会有一些优化,有些共享数据、或者寄存器读取、中断等情况时会发生优化错误。使用release版本的话,就没有使用这些优化,如果是编译器的问题,你可以对这些变量进行修饰,不让编译器进行优化。
csoapy 2010-12-17
  • 打赏
  • 举报
回复
[Quote=引用 20 楼 cranium 的回复:]
如果需要在release模式下调试,一般需要做2件事:
1、取消优化
2、生成PDB
[/Quote]
是的,把release的优化关掉就能显示正常了,以前只注意了debug下的优化是否打开。

十分感谢你的帮助!终于让这个问题有了个定论。
whslovexyp 2010-12-17
  • 打赏
  • 举报
回复
多半都是你的优化选项打开了,看看设置吧。另外,这个值输出就是正确的。
csoapy 2010-12-17
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 cranium 的回复:]
可以的话,我希望可以得到一份代码。
[/Quote]
这个没问题,就是麻烦一点:您还需要下载OpenCV2.2 for VS2010的安装包。安装完把include和lib路径设置一下的,我自己的是 D:\dev\OpenCV2.2

我的代码很简单的,只是把struct HOG继承了过来,重载了它一个computeGradient()的函数,函数内容也与基类中的完全一样,因为我想看看它是怎么执行的。

谢谢您的关注!这么晚了还来回贴。以下是完整代码和OpenCV2.2安装包的下载地址:
http://download.csdn.net/source/2916189
http://sourceforge.net/projects/opencvlibrary/
cranium 2010-12-17
  • 打赏
  • 举报
回复
[Quote=楼主]
release和debug模式的运行结果不一致,debug模式下正常,release下gradesize 为 (0,0):
[/Quote]

这个不是运行错误所致,而应是编译器没有足够信息导致解释错误。

使用下面代码打印信息,一切OK

//耗时
printf("gradsize h=%d,\tw=%d\n",gradsize.height,gradsize.width);
grad.create(gradsize, CV_32FC2); // <magnitude*(1-alpha), magnitude*alpha>
qangle.create(gradsize, CV_8UC2); // [0..nbins-1] - quantized gradient orientation


如果需要在release模式下调试,一般需要做2件事:
1、取消优化
2、生成PDB

而我在你的工程里只看到了生成PDB,而优化依然是02。
cranium 2010-12-17
  • 打赏
  • 举报
回复
刚刚在你的原帖回复了下,现在转过来又看到篇帖子,我还是那句话,可能内存结构不对劲了。

可以的话,我希望可以得到一份代码。

PS: CSDN帖子就这样,图片有时可以显示出来,有时不行,一般刷新次就挂了。。今天晚上不是才刚刚维护过,也是经常出问题。
zhengjiankang 2010-12-17
  • 打赏
  • 举报
回复
如果全部都一样
那还分什么debug release呢
werflychen 2010-12-17
  • 打赏
  • 举报
回复
有时候调试时,watch窗口显示不了全局变量,可以在调试状态下,再敲个空格进去,按下F10,它会重新生成,很多时候就可以看到那个变量了。。。。
csoapy 2010-12-16
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 whslovexyp 的回复:]
Maybe because you have turned on the optimization. Please change it to Disable.
[/Quote]除了添加库文件、include路径,其它项目设置都是默认。win32控制台程序。

[Quote=引用 4 楼 gsbb2004 的回复:]
调试的时候我一般都是查看自动窗口里的值,它会自动变,还是比较方便~~
[/Quote]自动窗口里面只有dx,同一行中的其它变量没有显示。请见第一幅截图
my1111ym 2010-12-16
  • 打赏
  • 举报
回复
调试的时候我一般都是查看自动窗口里的值,它会自动变,还是比较方便~~
luciferisnotsatan 2010-12-16
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 csoapy 的回复:]

唉,CSDN! csdn都做了多少年了?不能上传图片,回复不能超过3次,图像显示大点(1024*768)就显示不全……

大概只有bj人才会这样我行我素,视用户需求为大便吧!难道就没人搞个类似csdn的网站?

不能完全显示的图片看这里吧:
http://hi.csdn.net/attachment/201012/15/483932_129244144478Gd.png
http:/……
[/Quote]
现在头像都没的传了
whslovexyp 2010-12-16
  • 打赏
  • 举报
回复
Maybe because you have turned on the optimization. Please change it to Disable.
prohibit 2010-12-16
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 luciferisnotsatan 的回复:]

引用 1 楼 csoapy 的回复:

唉,CSDN! csdn都做了多少年了?不能上传图片,回复不能超过3次,图像显示大点(1024*768)就显示不全……

大概只有bj人才会这样我行我素,视用户需求为大便吧!难道就没人搞个类似csdn的网站?

不能完全显示的图片看这里吧:
http://hi.csdn.net/attachment/201012/15/483932_1292……
[/Quote]
很久很久了……
csoapy 2010-12-16
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 wqvbjhc 的回复:]
debug监视变量值那一列有个刷新的图标,你点一下刷新就有值的了。
[/Quote]
这一点我在第一幅图里面已经标出来了,图片比较大1024*768,可惜csdn论坛不支持缩放图片,所以看不见。你把这个在浏览器里面打开就行了:http://hi.csdn.net/attachment/201012/15/483932_129244144478Gd.png
wqvbjhc 2010-12-16
  • 打赏
  • 举报
回复
debug监视变量值那一列有个刷新的图标,你点一下刷新就有值的了。
release监视看到的结果是不靠谱的,要看的话cout输出慢慢研究。
csoapy 2010-12-16
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 shaoerping 的回复:]
我看到第二幅图里面是Release
[/Quote]
是的,但是这个的参数在debug和release模式下都是一样的,结果却不一样:debug正常,release是0
    Size gradsize(img.cols + paddingTL.width + paddingBR.width,
img.rows + paddingTL.height + paddingBR.height);
joey_zoy 2010-12-16
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 shaoerping 的回复:]

我看到第二幅图里面是Release
[/Quote]
+1
shaoerping 2010-12-16
  • 打赏
  • 举报
回复
我看到第二幅图里面是Release
加载更多回复(1)

64,637

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧