崩溃问题查找思路

来源:互联网 发布:做封面的软件 编辑:程序博客网 时间:2024/05/16 07:40

问题引起,是以前接手的两个控件,最近发现,在IE单进程下运行,同时多个页面运行,会崩溃。

如以往一样,查看指针是否为空,数组越界之类的,但是并未发现这种问题。

 

问题描述:

单进程IE,打开多个tab页,都调用my.ocx。会崩溃。
当打开的只有一个tab页时,运行正常。
当打开第二个tab页调用my.ocx时。就会崩溃。

如果多进程,每个tab一个进程,则不会崩溃。

ocx是文档视图结构。
崩溃是在myctrl中的oncreate()里面崩溃。
下面是oncreate里面的部分函数。

if (COleControl::OnCreate(lpCreateStruct) == -1)
return -1;

OnActivateInPlace(TRUE,   NULL);//by mjh  
AfxEnableControlContainer();

pDocTemplate = new CSingleDocTemplate(
IDR_MainTools,
RUNTIME_CLASS(CKCXZTDoc),
RUNTIME_CLASS(CMyPanel),       // 主 SDI 框架窗口
RUNTIME_CLASS(CKCXZTView));

CDocument *pDoc = pDocTemplate->CreateNewDocument();
m_pFrame  = pDocTemplate->CreateNewFrame(pDoc,NULL);

运行到m_pFrame  = pDocTemplate->CreateNewFrame(pDoc,NULL);就会崩溃。

pDoc 和pDocTemplate都不是NULL。

 

问题解决:

问题在于CMyPanel类的oncreate里。
新建了三个什么都没有的doc、frame、view类,替换进去,程序不崩溃。
依次替换,发现在panel类的时候崩溃。
换个想法也很容易想通,pDocTemplate->CreateNewFrame(pDoc,NULL);这句崩溃。windowsAPI几乎是不会出错,两个指针也是正常的,而这句函数的作用是新建一个frame并返回frame指针,那也就是说,可能出错的就是new CSingleDocTemplate时加进去的那个frame类了。

 

总结:

这次崩溃问题解决,开阔了一些思路,或者说增加了一些经验。

当追踪到崩溃产生的地方是windowsAPI这种库函数,且调用到的指针都是正常的。

看似无法再追踪下去的时候,要考虑这个函数的作用,它会做什么处理,在这个“处理”中,是否和自己编写的代码有关,从而造成的问题。

0 0