问题描述:
参照原Eclipse PDA文档和例子代码写了个调试插件,PDA当时是Eclipse3.1的例子,PDA对断点的处理,只是让你看到断点视中能够看到断点,并且不能在编辑器中双击左边“Ruler”条进行端点增加,删除。因为插件要尽量跟上Eclipse的插件发布速度,所以用Eclipse3.2来进行开发,并自己增加其他外围功能。其中就遇到了,断点在3.2中不能持久化,关闭eclipse后原有的断点在下次开启eclipse时都不见了.并且断点在编辑器中文件关闭后,重新打开文件,断点在编辑器左边的"ruler"条上的图标消失了.非常郁闷的问题,
问题分析与解决:
遇到这样的问题,首先是我对eclipse的架构不熟悉,他的视图结构,视图的通信,更新数据流程不熟悉,所以,查找了eclipse3.2相关信息,了解到了eclipse3.2M6基于OSGI框架,所以将OSGI框架了解了一下,没有找到与断点和视图有关东西.以为问题会出现在BreakpontManager,这一条线上,可是找了半天,BreakpointListener,BreakpointManagerListener,这一条线的接口实现都没有问题.
,然后就开始对CDT的断点,进行分析,察看了CDT的断点相关代码,发现了我的代码里断点注册的时间和CDT的断点注册时间有点不同,因为我下断点每次都是new出来,然后调用DebugPlugin.getDefault().getBreakpointManager().addBreakpoint(IBreakpointbreakpoint);进行添加,而CDT则是在一个静态类CDIDebugModel.createLineBreakpoint(...);中进行创建断点,并在创建完断点后调用断点自己扩展的regist()方法进行注册,在regist()中调用了DebugPlugin.getDefault().getBreakpointManager().addBreakpoint(IBreakpointbreakpoint);经过对比,两种写法都没有问题,
既然断点添加没有问题,那么问题会在那里呢,想到了,文本标签,文本标签,其本质和断点标签因该是同样的原理,于是,翻阅ECLIPSE中的IResource接口,断点没找到,但却发现了在ECLIPSE中,IFile,IFolder,IProject,等IResource接口都是虚的,要连接本地文件才能形成文件/文件夹/工程的映射,IResource接口的实现类Resource,有createrMarker(Stringtype),这个方法很重要,因为无论你在任何一个资源上打任何一种类型的标记,都必须调用这个方法才能添加标记.回想在我创建断点时,构造函数就调用了resource.createrMarker(..);于是,就调试跟踪bookMarker调用这个的过程,写了个"hello worldAction"插件,调用了ResourcesPlugin.getWorkSpace().fineMember()找到一个文本资源,然后调用了他的resource.createrMarker(..);跟踪代码,找到了MarkerManager,这个类处理所有的Marker的添加,删除,改变,然后跟到启动Eclipse时加载Marker扩展点时察看每个marker类型,才发现我的,我自定义的marker的ID并不完整,缺少了该MARKER所在插件的插件ID前缀,才恍然大悟,
在这期间,翻阅了PDE,CDT,ECLIPSE的调试插件,慢慢查阅相关插件的原代码,才找到真正的原因在哪里,之前本人只是参照书上和扩展点,写东西,但并不了解扩展点的真实意图,所以写出来的东西出现的BUG非常难找出原因来,刚开始时,对SWT不熟,经常遇到线程安全为问题,也是这样,困扰了好久,翻了好久才找到SWT的空间创建必须在它的安全线程中.Display.getCurrent().asyncExec(runnable);
转载网址 : http://www.eclipseworld.org/bbs/read-cec-tid-12088.html
本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请
点击举报。