MFC debug版本运行报错

ACDINO 2010-06-28 02:27:41
现在手上的MFC程序,releas版本运行的很好,可是一旦改成debug版本之后,一运行就报错
"0x0058e288"指令引用的"0xfffffffc"内存。该内存不能为"read".
这样的报错似乎太抽象了,但我真的没办法提供更多的信息了。项目不是自己做的,本来想调试一下,可是这样的问题不解决没办法继续啊。
有人叫下个内存测试工具跟踪一下,有点迷茫。
哪位大侠给指点一下啊……谢谢啦!
...全文
431 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
JasonGmail 2010-06-29
  • 打赏
  • 举报
回复
release版本只是错误被隐藏起来了,0xfffffffc应该是重复释放同一内存引起的。
ACDINO 2010-06-29
  • 打赏
  • 举报
回复
傻了 把 pOldData->IsLocked这样的代码放到源代码里是不会变色的……
ACDINO 2010-06-29
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 yongta 的回复:]
用工具分析一下.
[/Quote]
不会啊 你教教我怎么用工具分析也行啊 谢谢了


昨天用断点跟了一天 发现有一个赋值的地方 鼠标移上去就说是错误的指针
比如:a=str(都是CString类型) 就会说 a 是错误指针
str 是有值的 展开看 str 的信息的时候是:
str "str的值"
ATL::CSimpleStringT<char,0> "str的值"
m_pszData 0x025c2b18 "str的值"
-42

这里最下面的 -42 是什么意思啊 是不是证明str这个值就已经有错了啊

程序执行到了 a=str 这一行了之后继续往下执行到CSimpleStringT中的
CSimpleStringT& operator=( __in const CSimpleStringT& strSrc )
{
CStringData* pSrcData = strSrc.GetData();
CStringData* pOldData = GetData();//这里展开pOldData会看到pStringMgr、\nDataLength、nAllocLength和nRefs都是显示的错误:无法计算表达式的值
if( pSrcData != pOldData)
{
if( pOldData->IsLocked() || pSrcData->pStringMgr != pOldData->pStringMgr )
{
SetString( strSrc.GetString(), strSrc.GetLength() );
}
else
{
CStringData* pNewData = CloneData( pSrcData );
pOldData->Release();
Attach( pNewData );
}
}

return( *this );
}


再下来就到了红色部分CStringData中的
bool IsLocked() const throw()
{
return nRefs < 0;//执行到这里就报错了(……读取位置0xfffffffc时发生访问冲突)
}

这些信息对各位高手有没有什么用啊 帮忙分析一下是哪里出错了啊
ForestDB 2010-06-29
  • 打赏
  • 举报
回复
帮顶。
ACDINO 2010-06-29
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 jasongmail 的回复:]
release版本只是错误被隐藏起来了,0xfffffffc应该是重复释放同一内存引起的。
[/Quote]
那麻烦你 能不能在帮我看一下 分析一下到底是什么地方错了呢 上面说到的赋值是这样的:
A B 类里面有相同的CString类型变量(str), 在程序已启动的时候就多 B 进行了初始化 ,也就是对 B 中的 str 进行了赋值 ,再往下执行的时候为 A 里面的 str 赋值。用的是 a->SetStr(b->GetStr().c_str())
yongta 2010-06-28
  • 打赏
  • 举报
回复
用工具分析一下.
ACDINO 2010-06-28
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 zhao4zhong1 的回复:]
设置“不使用预编译头文件”,重建所有
[/Quote]
这里早就已经设置好了 ,“不使用预编译头文件”
赵4老师 2010-06-28
  • 打赏
  • 举报
回复
设置“不使用预编译头文件”,重建所有
ACDINO 2010-06-28
  • 打赏
  • 举报
回复
很晕啊,主程序的Instranse方法里面初始化了一些配置信息、网络、硬件什么的,起了个线程显示初始化窗口。完了跟断电跟到上面说那里就不行了
zhangweiit 2010-06-28
  • 打赏
  • 举报
回复
release只是不报错,但不代表错误不存在
要不然,debug就没有存在的必要了

debug出错的时候,会弹出相应的代码在VS窗口中
从里面信息一般也可以看出大概是哪里出错
zhangweiit 2010-06-28
  • 打赏
  • 举报
回复
我的办法比较土,都是不断的断点,断点,一步一步做下去
直到找到出问题的那条代码

出问题一般以下几种情况
1,重复free,delete
2,对象未初始化就调用
3,对象初始化的时候,分配的空间大小错了
...
ACDINO 2010-06-28
  • 打赏
  • 举报
回复
怎么没有人啦,真希望能有个人来帮我调试一下……

INT_PTR CALLBACK AfxDlgProc(HWND hWnd, UINT message, WPARAM, LPARAM)
{
if (message == WM_INITDIALOG)
{
// special case for WM_INITDIALOG
CDialog* pDlg = DYNAMIC_DOWNCAST(CDialog, CWnd::FromHandlePermanent(hWnd));
if (pDlg != NULL)
return pDlg->OnInitDialog();//程序执行了这一步
else
return 1;
}
return 0;
}//到这个方法结束的时候就提示说:没有可用于当前位置的源代码 确定/显示反汇编 这样的对话框


不知道怎么贴图片 晕
ACDINO 2010-06-28
  • 打赏
  • 举报
回复
设了断点了,可是程序运行到dlgcore.cpp的下面这个方法的时候就提示说没有可用于当前位置的源代码,无法继续了。
INT_PTR CALLBACK AfxDlgProc(HWND hWnd, UINT message, WPARAM, LPARAM)
{
if (message == WM_INITDIALOG)
{
// special case for WM_INITDIALOG
CDialog* pDlg = DYNAMIC_DOWNCAST(CDialog, CWnd::FromHandlePermanent(hWnd));
if (pDlg != NULL)
return pDlg->OnInitDialog();
else
return 1;
}
return 0;
}
  • 打赏
  • 举报
回复
工具是个好东东
Luyi06292 2010-06-28
  • 打赏
  • 举报
回复
Debug和release是有区别的. 设个断点 F9 跟一下。 看是不是 没初始化~~
lvshaoqing 2010-06-28
  • 打赏
  • 举报
回复
[Quote=引用楼主 acdino 的回复:]
现在手上的MFC程序,releas版本运行的很好,可是一旦改成debug版本之后,一运行就报错
"0x0058e288"指令引用的"0xfffffffc"内存。该内存不能为"read".
这样的报错似乎太抽象了,但我真的没办法提供更多的信息了。项目不是自己做的,本来想调试一下,可是这样的问题不解决没办法继续啊。
有人叫下个内存测试工具跟踪一下,有点迷茫。
哪位大侠给指点一下啊……谢谢啦!
[/Quote]

没好的办法,只能一一查找所有指针。
releas版本能运行,并不代表你的程序没有问题。 恰恰相反,debug才能更好的反应这点。

64,691

社区成员

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

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