阴魂不散的user breakpoint called from code at 0x7c92120e

kangshifu091 2010-10-24 04:06:30
首先说一下,这个问题已经跟着我几个月,一直解决不了。
AfxWndProc(HWND__ * 0x000204d6, unsigned int 275, unsigned int 1, long 0) line 375 + 30 bytes
AfxWndProcBase(HWND__ * 0x000204d6, unsigned int 275, unsigned int 1, long 0) line 220 + 21 bytes
USER32! 77d18734()
USER32! 77d18816()
USER32! 77d189cd()
USER32! 77d18a10()
USER32! 77d27721()
USER32! 77d249c4()
USER32! 77d3a956()
USER32! 77d3a2bc()
USER32! 77d663fd()
USER32! 77d664a2()
USER32! 77d50877()
USER32! 77d5082f()
__crtMessageBoxA(const char * 0x00123834, const char * 0x102579a0 `string', unsigned int 73746) line 65
CrtMessageWindow(int 2, const char * 0x5f4d0cf0 THIS_FILE, const char * 0x00124968, const char * 0x00000000, const char * 0x0012698c) line 520 + 22 bytes
_CrtDbgReport(int 2, const char * 0x5f4d0cf0 THIS_FILE, int 313, const char * 0x00000000, const char * 0x00000000) line 419 + 76 bytes
AfxAssertFailedLine(const char * 0x5f4d0cf0 THIS_FILE, int 313) line 39 + 20 bytes
CWnd::FromHandlePermanent(HWND__ * 0x000204d6) line 313 + 32 bytes
CWnd::WalkPreTranslateTree(HWND__ * 0x00020540, tagMSG * 0x00465b18 {msg=0x00000113 wp=0x00000002 lp=0x00000000}) line 2674 + 9 bytes
CWinThread::PreTranslateMessage(tagMSG * 0x00465b18 {msg=0x00000113 wp=0x00000002 lp=0x00000000}) line 672 + 18 bytes
CWinThread::PumpMessage() line 848 + 30 bytes
CWnd::RunModalLoop(unsigned long 4) line 3489 + 19 bytes
CDialog::DoModal() line 539 + 12 bytes
CtoolbbApp::InitInstance() line 82 + 11 bytes
AfxWinMain(HINSTANCE__ * 0x00400000, HINSTANCE__ * 0x00000000, char * 0x001423a6, int 1) line 39 + 11 bytes
WinMain(HINSTANCE__ * 0x00400000, HINSTANCE__ * 0x00000000, char * 0x001423a6, int 1) line 30
WinMainCRTStartup() line 330 + 54 bytes
KERNEL32! 7c817077()


下面是坛友的热心指点:
(1)lazy_2010的指点,
应该是你的 WM_TIMER 消息处理的时候,发现错误了,即
AfxWndProc(, 275, ); 的代码,那里比较重要,下面分析看看是什么错误信息。
275 = 0x0113,即 WM_TIMER。
从 AfxWndProc 的代码来看,有两个 ASSERT
C/C++ code
CWnd* pWnd = CWnd::FromHandlePermanent(hWnd);
ASSERT(pWnd != NULL);
ASSERT(pWnd->m_hWnd == hWnd);
估计是你的 window (HWND)已经无效了?

想办法输出创建的窗口的 HWND,然后在出现问题的时候看看是哪个窗口,再考虑这个窗口或者它的父窗口是否对应的 CWnd 对象的函数处理存在问题吧。

注意:我已经输出了,找到了是哪个窗口的问题了,但是下一步不知道怎么做了?
我用到了PropertySheet ,
m_tab.InsertItem(1,_T("WI"));
m_wiboo.Create(IDD_DIALOG_WI,&m_tab);

我在出错的那个窗口的WM_TIMER消息中的代码是这样的:
void CReadText::OnTimer(UINT nIDEvent)
{
// TODO: Add your message handler code here and/or call default
TCHAR buf0[50],buf1[50];
memset(buf0,0,sizeof(buf0));
memset(buf1,0,sizeof(buf1));
SYSTEMTIME st;
::GetLocalTime(&st);
sprintf(buf0,"%2d%2d%2d",st.wHour,st.wMinute,st.wSecond);

if((int)process_hand==0xcccccccc)
return;
if (nIDEvent==1)
{
TCHAR popWiTeBuf[255];
memset(popWiTeBuf,0,sizeof(popWiTeBuf));
if(((CloveApp *)AfxGetApp())->g_ifDecideWindow==0)
{
this->GetDlgItem(IDC_POINT)->SetWindowText("第一手资料表示0");
}
if (((CloveApp *)AfxGetApp())->g_ifDecideWindow==2)
{
sprintf(popWiTeBuf,"第一手%d//第二手%d",m_IDCstartNum,m_IDCingNum);
this->GetDlgItem(IDC_POINT)->SetWindowText(popWiTeBuf);
}

int studentNum=0;
studentNum=CRapTed::m_stuPtrArray.GetSize();
TCHAR buf[50];
memset(buf,0,sizeof(buf));
sprintf(buf,"管理学籍:%d",studentNum);
this->GetDlgItem(IDC_TAKECAREOF_PLANT)->SetWindowText(buf);
}
if (nIDEvent==2)
{
if(m_boolList)
{
int nowadaySayBase=0x7ff920;
TCHAR newstumaxBuf[255];
memset(newstumaxBuf,0,sizeof(newstumaxBuf));
::ReadProcessMemory(process_hand,(LPVOID)nowadaySayBase,newstumaxBuf,100,0);
this->GetDlgItem(IDC_NOWADAY_TEXT)->SetWindowText(newstumaxBuf);
int num=0;
bool goRead=0;
int nHeadNum=m_list.GetItemCount();
int textNum=0;
for(int i=0;i<100;i++)
{
if(strlen(m_readTextStrBuf[i])>2)
textNum++;
}
TCHAR strBuf[255];
memset(strBuf,0,sizeof(strBuf));
sprintf(strBuf,"Array总数:%d添加的学籍编号:%d,将要添加的学籍编号:%d",textNum,m_realTextNum-1,m_indexNum);
this->GetDlgItem(IDC_TEXTARRAY_NUM)->SetWindowText(strBuf);
}
}
CDialog::OnTimer(nIDEvent);
}
(2)arong1234的指点
你程序里有SetTimer(1 ....)之类得代码么?如果有,对应得消息处理函数是怎样得?


两位达人都这样说了,跟timer有关系,我就都贴出来了。

请大家看看我的问题究竟出在哪里?


我的分数不多了,就65分了,结贴之前我会追加分数的。谢谢啦!
...全文
732 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
kangshifu091 2010-11-06
  • 打赏
  • 举报
回复
解决了。
终于解决了。
数组溢出。
下面说一下分析方法:
这个地方的断言,提示PWnd地址保存的数据已经不是正确的指针了。
ASSERT(pWnd->m_hWnd == hWnd);
其实用一个简单的方法就可以定位,因为数据不对了,肯定就是被非法篡改了,在这个地方下内存写入断点就可以了。这样就可以轻易找到错误的代码了。
其实我当时这样做了,但因为错误不经常出,等了很长时间也等到错误的发生,结果就去查看内存,看看这个被篡改的地址的前面是定义的哪个变量。结果发现了一个自己定义的数组。
在仔细检查这个数组后,发现确实有溢出的可能。
就这样解决了。

本人为菜鸟,有的地方表达不准确请见谅。高手见后请指正。

感谢大家的支持!



ouyh12345 2010-10-26
  • 打赏
  • 举报
回复
我用SetWindowText崩溃过
kangshifu091 2010-10-26
  • 打赏
  • 举报
回复
我用的是static text 应该没有ReplaceSel方法吧。
我看好多教程都是用的SetWindowText()啊。难道真是它惹得祸吗?
gules 2010-10-26
  • 打赏
  • 举报
回复
用SendMessage的方法对其设置文本。
kangshifu091 2010-10-26
  • 打赏
  • 举报
回复
晕了孙鑫的教程就是这么教的。
哎... ...
我用什么函数来替代它呢?
请赐教。
ouyh12345 2010-10-25
  • 打赏
  • 举报
回复
在多线程下,设置编辑框的内容,不要直接调用SetWindowText
用SetSel, ReplaceSel
kangshifu091 2010-10-25
  • 打赏
  • 举报
回复
大家来帮忙吧
kangshifu091 2010-10-25
  • 打赏
  • 举报
回复
好的谢谢,我试一下。

64,691

社区成员

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

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