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

时间:2021-10-15 23:30:57
比如我写这么两句 我写在 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++

9 个解决方案

#1


堆栈里面不用看系统代码,只看自己的代码就行。类似这样的问题可以很快找到位置

#2


这不是MFC的问题,可能是编译器的问题,可能是某些编译选项改变了。

#3


谢谢回复。悲剧的就是。堆栈里没有自己代码,全是系统代码。
引用 1 楼  的回复:
堆栈里面不用看系统代码,只看自己的代码就行。类似这样的问题可以很快找到位置

#4


我这个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++

#5


自己顶起来。

#6


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]

#7


vs2012 也是这样的。
为什么这类错误最后都定在这GetThreadValue(int nSlot) 。而且堆栈完全看不出来所以然。

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

要是vc6堆栈一般是
...
....
dosomethig.
onmousemove..
oncmdmsg...
至少我能找到怀疑的地方啊。

#8


找到答案了。
http://social.msdn.microsoft.com/Forums/en-US/vstudiozhchs/thread/2509c536-b00c-442e-ba0a-f9839e1c76be

这是微软 vs2010 在win7 64位下的一个已知bug。

#9


那我WIN 7 32位的也出现这个问题,怎么解?

#1


堆栈里面不用看系统代码,只看自己的代码就行。类似这样的问题可以很快找到位置

#2


这不是MFC的问题,可能是编译器的问题,可能是某些编译选项改变了。

#3


谢谢回复。悲剧的就是。堆栈里没有自己代码,全是系统代码。
引用 1 楼  的回复:
堆栈里面不用看系统代码,只看自己的代码就行。类似这样的问题可以很快找到位置

#4


我这个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++

#5


自己顶起来。

#6


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]

#7


vs2012 也是这样的。
为什么这类错误最后都定在这GetThreadValue(int nSlot) 。而且堆栈完全看不出来所以然。

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

要是vc6堆栈一般是
...
....
dosomethig.
onmousemove..
oncmdmsg...
至少我能找到怀疑的地方啊。

#8


找到答案了。
http://social.msdn.microsoft.com/Forums/en-US/vstudiozhchs/thread/2509c536-b00c-442e-ba0a-f9839e1c76be

这是微软 vs2010 在win7 64位下的一个已知bug。

#9


那我WIN 7 32位的也出现这个问题,怎么解?