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
谢谢回复。悲剧的就是。堆栈里没有自己代码,全是系统代码。
#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++
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]
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...
至少我能找到怀疑的地方啊。
为什么这类错误最后都定在这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。
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
谢谢回复。悲剧的就是。堆栈里没有自己代码,全是系统代码。
#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++
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]
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...
至少我能找到怀疑的地方啊。
为什么这类错误最后都定在这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。
http://social.msdn.microsoft.com/Forums/en-US/vstudiozhchs/thread/2509c536-b00c-442e-ba0a-f9839e1c76be
这是微软 vs2010 在win7 64位下的一个已知bug。
#9
那我WIN 7 32位的也出现这个问题,怎么解?