我们系统虽然已经经历过一次qt化,但是仍然有一些默认的程序还是基于gtk的,例如mate-terminal和filezilla,这些程序在我们系统上,针对一些使用习惯上的问题,还是存在一些bug的,对于这些问题,我们是操作系统的提供者,所以有必要查看原因和解决。
例如filezilla程序在我们默认kylin-virtual-keyboard程序上会默认自动唤起虚拟键盘,经过定位我们发现此行为的原因是filezilla主动发起了focus事件,所以对于kylin-virtual-keyboard的行为是正常的,这种情况下,我们就需要调试filezilla。而针对gtk程序,通常情况下,我们有一个检查程序inspector,这个程序可以给我们初步定位问题,本文章主要介绍一下inspector的使用说明。便于大家针对gtk的程序来进行初步问题筛查
针对gtk类的程序,我们都可以用gtk debug来尝试调试,gtk包含了多个调试选项,这里就不一一列举了,可以参考如下文章,我们以gtk3为例
https://docs.gtk.org/gtk3/running.html
我们关心的是inspector,所以如下:
interactive: Open the interactive debugger
关于检查器的官方介绍文档,可以参考如下:
https://developer.gnome.org/documentation/tools/inspector.html
inspector有多种打开方式,主要如下:
我们可以通过--gtk-debug=interactive打开程序的检查器,以filezilla为例
# filezilla --gtk-debug=interactive
可以通过赋予GTK_DEBUG的值来打开调试,如下:
# GTK_DEBUG=interactive filezilla
为了支持快捷键打开检查器,我们需要先将gtk的gsettings值打开,如下:
gsettings set org.gtk.Settings.Debug enable-inspector-keybinding true
此时我们可以通过如下两种方式打开(在运行程序内部按下快捷键)
ctrl + shift + i / ctrl + shift + d
打开后调试界面如下所示:
通过上述图片我们可以发现几个要素,如下:
我们打开检查器时,默认就打开了对象信息,如上图,未展开情况下我们可以知道此程序顶层存在几个widget,可以发现filezilla总共存在三个GtkWindow顶层窗口。这里两个置灰的窗口意味着未正常显示。所以如果我们点击非置灰的GtkWindow,我们可以看到filezilla程序会闪烁如下:
根据上述,我们可以知道第二个GtkWindow就是filezilla的顶层窗口,我们可以进一步跟踪,直到找到远程站点的文件列表的GtkWidget是什么类型为止,如下图,我们发现远程站点的文件列表实际上是一个GtkScrolledWindow类型。
如果需要显示统计信息,则需要将glib设置为debug版本,也就是提供 --enable-debug
参数,并且程序在运行时需要提供如下配置:
GOBJECT_DEBUG=instance-count
这里我们的系统没有把glib编译带此参数,故无法演示
对于资源,我们可以理解和qt的res一样,也就是这个程序需要加载的动效,图片,和css,主要是一个统计作用,效果如下:
样式表我们可以给对应的窗口设置相应的样式用作测试css效果。
这里有多种关于主题,窗口属性,渲染细节的设置,细节不一一展示了,如下所示。
这里提供了gtk版本等一系列的基本信息的查看,如下:
inspector可以支持直接选择对象,我们点击右上角的准星按钮如下:
此时我们的光标变成准星来选择窗口,如下
当选择完毕,则提供这个窗口的显示细节,如下显示
以属性为例,我们可以动态的修改某个子窗口的属性值如下
细节是靠近选择对象的按钮,它可以将窗口转到窗口的具体细节,例如杂项,属性,信号,子元素属性,类层级结构,CSS选择器,CSS节点,放大镜,如下图:
至此,我们介绍了inspector的基本操作,希望这些介绍有助于我们调试linux上的gtk程序