我这个vs2010 有一个小问题,有人遇到过么(100分噢)

hanbingture 2012-09-25 05:53:03
比如我写这么两句 我写在 OnMouseMove中的。

CClassXXXX *pClassXXXX=NULL;
pClassXXXX->DoSomeThing();


debug下运行,一定会报错。

在vc6中系统会自动停止在报错那一行。就是pClassXXXX->DoSomeThing();然后调用堆栈也是能看到这一行。
可是在vs2010中这个简单的指针为空的问题。竟然找不到报错的具体位置。调用堆栈也是像下面这样。乱糟糟的。
什么原因呢,是mfc的架构给改变了么。


> mfc100d.dll!ATL::ShouldTraceOutput(unsigned long dwModule, unsigned long dwCategory, unsigned int nLevel, const CAtlTraceCategory * * ppCategory, int (int, const char *, int, const char *, const char *, <no type>)* * pfnCrtDbgReport) 行 648 + 0x11 字节 C++
mfc100d.dll!AtlTraceVA(unsigned long dwModule, const char * pszFileName, int nLine, unsigned long dwCategory, unsigned int nLevel, const char * pszFormat, char * ptr) 行 387 + 0x19 字节 C++
cccccccc()
mfc100d.dll!CWnd::OnWndMsg(unsigned int message, unsigned int wParam, long lParam, long * pResult) 行 2495 C++
mfc100d.dll!CWnd::WindowProc(unsigned int message, unsigned int wParam, long lParam) 行 2067 + 0x20 字节 C++
mfc100d.dll!AfxCallWndProc(CWnd * pWnd, HWND__ * hWnd, unsigned int nMsg, unsigned int wParam, long lParam) 行 248 + 0x1c 字节 C++
mfc100d.dll!AfxWndProc(HWND__ * hWnd, unsigned int nMsg, unsigned int wParam, long lParam) 行 411 C++
mfc100d.dll!AfxWndProcBase(HWND__ * hWnd, unsigned int nMsg, unsigned int wParam, long lParam) 行 420 + 0x15 字节 C++
...全文
906 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
WongWoo1991 2013-10-16
  • 打赏
  • 举报
回复
那我WIN 7 32位的也出现这个问题,怎么解?
hanbingture 2012-09-25
  • 打赏
  • 举报
回复
找到答案了。
http://social.msdn.microsoft.com/Forums/en-US/vstudiozhchs/thread/2509c536-b00c-442e-ba0a-f9839e1c76be

这是微软 vs2010 在win7 64位下的一个已知bug。
hanbingture 2012-09-25
  • 打赏
  • 举报
回复
vs2012 也是这样的。
为什么这类错误最后都定在这GetThreadValue(int nSlot) 。而且堆栈完全看不出来所以然。

vc6是一定能查出这个错误的,即使没有判断this指针。而且整个堆栈都没有doSomething这个函数,和调用doSomething的这个函数。这让我们如何查。从vc6过来的我。表示很不理解解。

要是vc6堆栈一般是
...
....
dosomethig.
onmousemove..
oncmdmsg...
至少我能找到怀疑的地方啊。
swp543210 2012-09-25
  • 打赏
  • 举报
回复
pClassXXXX->DoSomeThing();就算pClassXXXX=0也不是有错误的。
class里面的成员函数的调用方式是thiscall,这样使用只是this指针为0
如果函数里面会检查this指针这个函数不会有任何问题。
例如:
CWnd* pc = NULL;
pc->GetSafeHwnd();// 无错误
pc->m_hWnd;// 这句会提示非法访问
// mov ecx, this
// mov ebx, dowrd ptr [ecx + m_hWnd]
hanbingture 2012-09-25
  • 打赏
  • 举报
回复
自己顶起来。
hanbingture 2012-09-25
  • 打赏
  • 举报
回复
我这个vs2010.新建一个工程。mdi程序。什么都不改。加一个菜单项处理函数。


void CMainFrame::On32771()
{
Ctest5View* view=NULL;
view->Invalidate();
}

就这行。报错。


堆栈是他妈的这样的。见鬼了。


ntdll.dll!77b815de()
[下面的框架可能不正确和/或缺失,没有为 ntdll.dll 加载符号]
ntdll.dll!77b815de()
ntdll.dll!77b7014e()
> mfc100ud.dll!CThreadSlotData::GetThreadValue(int nSlot) 行 266 C++
hanbingture 2012-09-25
  • 打赏
  • 举报
回复
谢谢回复。悲剧的就是。堆栈里没有自己代码,全是系统代码。
[Quote=引用 1 楼 的回复:]

堆栈里面不用看系统代码,只看自己的代码就行。类似这样的问题可以很快找到位置
[/Quote]
healer_kx 2012-09-25
  • 打赏
  • 举报
回复
这不是MFC的问题,可能是编译器的问题,可能是某些编译选项改变了。
matrixcl 2012-09-25
  • 打赏
  • 举报
回复
堆栈里面不用看系统代码,只看自己的代码就行。类似这样的问题可以很快找到位置

16,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

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