Eclipse修改Disassembly页面Ruler背景色报错如何解决
Eclipse 2022-06修改反汇编视图标尺背景色报错解决方案
问题基本信息
- 运行环境:Ubuntu 20.04.4,GTK桌面,Eclipse 2022-06-R(4.24.0 嵌入式C/C++版本,内置JRE 17.0.3)
- 触发场景:STM32调试过程中,打开首选项修改Disassembly(反汇编)页面Ruler(标尺)背景色,点击Apply按钮后弹出错误对话框
- 弹窗提示:An error has occurred. See error log for more details. Error notifying a preference change listener. Check the log for details.

根因定位
从工作空间.metadata目录下的.log日志提取的报错栈显示,错误由CDT调试插件的UI渲染逻辑触发:
org.eclipse.core.runtime.AssertionFailedException: assertion failed: at org.eclipse.core.runtime.Assert.isTrue(Assert.java:113) at org.eclipse.cdt.dsf.debug.internal.ui.disassembly.provisional.DisassemblyRulerColumn.getBaselineBias(DisassemblyRulerColumn.java:935) at org.eclipse.cdt.dsf.debug.internal.ui.disassembly.provisional.DisassemblyRulerColumn.doPaint(DisassemblyRulerColumn.java:763)
这是Eclipse 2022-06自带CDT版本的已知原生bug:当反汇编视图处于打开激活状态时,修改标尺背景色会立刻触发标尺控件重绘,重绘流程中getBaselineBias方法的前置断言校验不通过,直接抛出未捕获异常。该bug仅在Linux GTK桌面环境下可稳定复现,Windows/macOS环境无此问题。
可行解决方法
按优先级从高到低排列:
- 升级Eclipse到2022-09及更高版本:该断言bug在后续CDT迭代中已被正式修复,升级后可直接在首选项界面正常修改反汇编视图所有颜色配置,无兼容问题。
- 手动修改配置文件绕过界面校验:
- 完全退出Eclipse,确保进程无残留
- 进入当前工作空间路径下的
.metadata/.plugins/org.eclipse.core.runtime/.settings/目录 - 找到名为
org.eclipse.cdt.dsf.debug.ui.prefs的配置文件,用文本编辑器打开 - 新增/修改配置项指定标尺背景色,颜色格式为RGB三通道数值,例如设置纯白色背景添加如下行:
disassembly.ruler.background=255,255,255
如需设置其他颜色,替换为对应RGB值即可,例如深灰背景为disassembly.ruler.background=30,30,30 - 保存文件后重启Eclipse,配置会自动加载生效,无需在首选项界面触发Apply操作。
- 临时规避操作:修改颜色配置前先关闭所有打开的反汇编视图,再进入首选项修改对应颜色项,修改完成点击Apply后再打开反汇编视图,可避免重绘触发断言,但该方法偶发失效,不推荐长期使用。
完整报错日志
!SESSION 2022-06-22 10:23:51.271 ----------------------------------------------- eclipse.buildId=4.24.0.I20220607-0700 java.version=17.0.3 java.vendor=Eclipse Adoptium BootLoader constants: OS=linux, ARCH=x86_64, WS=gtk, NL=zh_CN Framework arguments: -product org.eclipse.epp.package.embedcpp.product Command-line arguments: -os linux -ws gtk -arch x86_64 -product org.eclipse.epp.package.embedcpp.product !ENTRY org.eclipse.ui 4 0 2022-06-22 10:24:11.769 !MESSAGE Unhandled event loop exception !STACK 0 org.eclipse.core.runtime.AssertionFailedException: assertion failed: at org.eclipse.core.runtime.Assert.isTrue(Assert.java:113) at org.eclipse.core.runtime.Assert.isTrue(Assert.java:99) at org.eclipse.cdt.dsf.debug.internal.ui.disassembly.provisional.DisassemblyRulerColumn.getBaselineBias(DisassemblyRulerColumn.java:935) at org.eclipse.cdt.dsf.debug.internal.ui.disassembly.provisional.DisassemblyRulerColumn.doPaint(DisassemblyRulerColumn.java:763) at org.eclipse.cdt.dsf.debug.internal.ui.disassembly.provisional.DisassemblyRulerColumn.doubleBufferPaint(DisassemblyRulerColumn.java:697) at org.eclipse.cdt.dsf.debug.internal.ui.disassembly.provisional.DisassemblyRulerColumn.lambda$1(DisassemblyRulerColumn.java:606) at org.eclipse.swt.widgets.TypedListener.handleEvent(TypedListener.java:234) at org.eclipse.swt.widgets.EventTable.sendEvent(EventTable.java:89) at org.eclipse.swt.widgets.Display.sendEvent(Display.java:5794) at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1529) at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1555) at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1538) at org.eclipse.swt.widgets.Control.gtk_draw(Control.java:3882) at org.eclipse.swt.widgets.Scrollable.gtk_draw(Scrollable.java:365) at org.eclipse.swt.widgets.Composite.gtk_draw(Composite.java:496) at org.eclipse.swt.widgets.Canvas.gtk_draw(Canvas.java:174) at org.eclipse.swt.widgets.Widget.windowProc(Widget.java:2409) at org.eclipse.swt.widgets.Control.windowProc(Control.java:6832) at org.eclipse.swt.widgets.Display.windowProc(Display.java:6114) at org.eclipse.swt.internal.gtk3.GTK3.gtk_main_do_event(Native Method) at org.eclipse.swt.widgets.Display.eventProc(Display.java:1552) at org.eclipse.swt.internal.gtk3.GTK3.gtk_main_iteration_do(Native Method) at org.eclipse.swt.widgets.Display.readAndDispatch(Display.java:4474) at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine$5.run(PartRenderingEngine.java:1155) at org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:338) at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.run(PartRenderingEngine.java:1046) at org.eclipse.e4.ui.internal.workbench.E4Workbench.createAndRunUI(E4Workbench.java:155) at org.eclipse.ui.internal.Workbench.lambda$3(Workbench.java:644) at org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:338) at org.eclipse.ui.internal.Workbench.createAndRunWorkbench(Workbench.java:551) at org.eclipse.ui.PlatformUI.createAndRunWorkbench(PlatformUI.java:156) at org.eclipse.ui.internal.ide.application.IDEApplication.start(IDEApplication.java:152) at org.eclipse.equinox.internal.app.EclipseAppHandle.run(EclipseAppHandle.java:203) at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.runApplication(EclipseAppLauncher.java:136) at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.start(EclipseAppLauncher.java:104) at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:402) at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:255) at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.base/java.lang.reflect.Method.invoke(Method.java:568) at org.eclipse.equinox.launcher.Main.invokeFramework(Main.java:659) at org.eclipse.equinox.launcher.Main.basicRun(Main.java:596) at org.eclipse.equinox.launcher.Main.run(Main.java:1467) at org.eclipse.equinox.launcher.Main.main(Main.java:1440)
内容的提问来源于stack exchange,提问作者Enming Zhang
相关产品推荐
相关产品推荐

