[Share Experiences] 尝试修好一个bug (一)开发环境配置
Tofloor
poster avatar
冒得先生
deepin
2022-03-13 06:43
Author

出发点

发帖子的时候,发现deepin自带的截屏工具在自己的电脑上工作不正常。确认了一下,自己是最新的版本,确认是一个目前存在的bug了。想着自己怎么的也是一个程序员,改bug最熟练了,而且这应该是一个开源的工具,那么就自己改一改。虽然没有任何的上下文。

俗话说满桶不会响,半桶响叮当。我这个半桶水希望能够记录下来,自己试图解决这样一个bug过程中,遇到的问题。或许其它开发者看到,不说改进,算是帮人蹚雷吧。

bug 描述

  • 在我的电脑上, 截屏工具打开后,选择窗口时,高亮框定的区域,并不是窗口所在位置。同时,灰色的区域,没有覆盖所有的其它的显示面积。桌面出现了重影。

IMG_20220312_210827.jpg

  • 如果点击的截图,会保留高亮区域的一部分(如下图所示)

    截图_滚动截图_20220312211109.png

  • 高亮区域和原始窗口位置,不是简单的偏移关系。在不同显示器上(我有多台显示器),偏移的相对关系不一致。有的会到另一个显示器的对应位置,有的会偏移一部份。

具体的配置过程

既然确定了是有bug,下一步就是看源码。这里我遇到了第一个问题,哪里能够找到源代码?

我首先就是想到了到官网找。然后我找到了深度官网深度截屏的 介绍页,在介绍页上,看到了deepin-screenshot,不过可惜,项目已经被存档,不再更新了。后来从官网的介绍页上,找到了screen-recorder

的github地址。可惜,这个github地址依然是readonly的,不是项目地址。后来,在论坛发帖,感谢@deepin-superuser , 给我提供了正确的项目地址。 终于,找到了正确的项目地址。同时也确认了deepin开源项目,目前在github上是在linuxdeepin这个组织下。对于不会爬墙的同学,我也不知道怎么爬墙。项目组的人估计知道,好奇的同学问他们去吧。

找到了代码库, 拉到本地,首先是找开发者文档。 README上有开发者文档的链接,我很开心,点开后,发现高兴得太早了…… 用户文档和开发者文档的链接,早已失效。而且,在这个深度的wiki上,我找不到任何有用的项目引导信息。再次感谢@deepin-superuser,给我提供了开发者引导 , 和 DTK引导页 。非常有帮助。没有这两个链接,我会走很多弯路。当然,这两个链接都是github host的。

终于,代码拉到本地了。我要做的第一件事,是在本地构建最新的项目,并且复现问题 。要构建项目,我需要确认项目是什么语言什么框架的项目。我看到了 .pro 结尾的文件,确认了是QT的项目(碰巧,之前接触过qt5,刚好认识),那我首先要做的,就是准备qt5的环境。

我马上就上了qt官网,下载了QT5.12的opensource offline安装包。可是,即使我注册了用户,也没有办法进行安装,说不能混用协议等等(估计和我使用163邮箱有关。网易是有商业的qt项目的)。所以我只好下载了源码包,手动编译。

在等待漫长地编译过程中,我搜了一下deepin商店的图形化安装,看了一下评论,说版本很老旧,放弃。又在论坛上搜了一下,看到有人说可以用apt安装,顿时有了兴趣。同时,我也翻到了统信的DTK文档,里面刚好有apt 安装qt的指引,那就大致按照这个流程来走了。



#!/bin/bash

# 安装QT,qt编辑工具qtcreator,还有qt构建相关依赖
sudo sed -i "s%#deb-src%deb-src%g" /etc/apt/sources.list
sudo apt update
sudo apt install git qtcreator qt5-default build-essential

# 克隆代码
WORKSPACE_DIR=`pwd`
git clone https://github.com/linuxdeepin/deepin-screen-recorder

# 进入项目目录
cd deepin-screen-recorder
PROJ_DIR=`pwd`

进入项目目录后,按照项目README里写的,执行

#!/bin/bash

mkdir build
cd build
qmake ..
make

一点都不意外的,构建失败了。错误信息如下。

...
WARNING: Project ERROR: Unknown module(s) in QT: dtkgui dtkwidget KI18n x11extras multimedia multimediawidgets
...
pin-screen-recorder_bo.qm'...
    Generated 123 translation(s) (123 finished and 0 unfinished)
Project MESSAGE: deepin-screen-recorder enabled accessibility function with set:  true
Project ERROR: xcb-util development package not found
make: *** [Makefile:49:sub-src-make_first] 错误 3

看了错误信息,那一个一个修。目前的错误,看起来是有依赖包没有安装好。依次解决,每次安装依赖之后,重新执行一次make:

# xcb-util development package not found

sudo apt install libxcb-util-dev

# dframeworkdbus development package not found

sudo apt install libdframeworkdbus-dev

# Project ERROR: Unknown module(s) in QT: dtkgui dtkwidget x11extras multimedia multimediawidgets

系统包的依赖解决之后,留下了QT有模块找不到的问题。这几个包的名字,头两个,看起来像是dtk的包。按照UOS的dtk安装教程 , 配置好项目。

#!/bin/bash

cd $WORKSPACE_DIR

apt source dtkcore dtkwidget dtkgui qt5integration
sudo apt build-dep dtkcore dtkwidget dtkgui qt5integration

cur_dir=`pwd`
dtk_list="dtkcore dtkgui dtkwidget qt5integration";
for i in $dtk_list; do mkdir -p $i/build; cd $i/build; qmake ../*.pro CONFIG+=debug && make -j4 && cd $cur_dir; done;

在qtcreator构建好这几个项目之后,构建recorder出现的新的错误信息。搜了一下dde-dock的文档,找到了安装指令。图省事,直接安装包,就不从源码构建了。

# dde-dock/pluginsiteminterface.h No such file or directory
# https://github.com/linuxdeepin/dde-dock/blob/master/plugins/plugin-guide/plugins-developer-guide.md

sudo apt install dde-dock-dev cmake qtbase5-dev-tools pkg-config

# :-1: warning: Project ERROR: Unknown module(s) in QT: KI18n multimedia multimediawidgets

sudo apt install libqt5multimediawidgets5
sudo apt-get build-dep qtmultimedia5-dev 


# /home/carwest/Workspace/Deepin/deepin-screen-recorder/src/utils/pixmergethread.h:31: error: opencv2/opencv.hpp: No such file or directory
 #include
         ^~~~~~~~~~~~~~~~~~~~

sudo apt-get install libopencv-dev

接着出现错误,X11/extensions/record.h 找不到。依赖包都安装了。我找了一下,这个文件在我本地的 /usr/include 目录下有,但是项目找不到。只好在qtcreator里,多设置了环境变量。

$ apt-file search X11/extensions/record.h
libxtst-dev: /usr/include/X11/extensions/record.h
nx-x11proto-xext-dev: /usr/include/x86_64-linux-gnu/nx-X11/extensions/record.h
CLFAGS="-I/usr/include"

终于,构建成功了!!!!!

同时,运行项目,成功复现了bug。心力交瘁呀!

实用小技巧

  • 如果遇到一个依赖包找不到,可以用apt search 来寻找对应的包。一般来说,一个包有纯release的包,如dde-dock, 只有使用的代码。如果是开发构建中,缺少依赖,一般是开发的包,命名一般是 xxx-dev,xxx-devel, libxxx-dev, 如dock的包名是 dde-dock-dev。
$ apt search dde-dock
正在排序... 完成
全文搜索... 完成  
com.github.lfxspeed/未知 0.6.4-1 amd64
  A lightweight and fast Internet speed plugin

dde-disk-mount-plugin/未知,now 5.5.3-1 amd64 [已安装]
  plugin of dde-dock

dde-dock/未知,now 5.5.9-1 amd64 [已安装,自动]
  deepin desktop-environment - dock module

dde-dock-dbgsym/未知 5.5.9-1 amd64
  debug symbols for dde-dock

dde-dock-dev/未知,now 5.5.9-1 amd64 [已安装]
  deepin desktop-environment - dock module development files

dde-dock-onboard-plugin/未知,now 5.5.9-1 amd64 [已安装]
  deepin desktop-environment - dock plugin for onboard

dde-dock-onboard-plugin-dbgsym/未知 5.5.9-1 amd64
  debug symbols for dde-dock-onboard-plugin

dock-network-plugin/未知,now 1.0.2-1 amd64 [已安装]
  the plugin of network for dde-dock

  • 如果有软件包你安装了之后,你找不到这个软件包的开发包,或者依赖包,可以尝试apt 的 build-dep。
  • 如果有头文件找不到,可以尝试用apt-file search , 找到对应的软件包

心路历程和感受

整个安装和配置的过程,遇到了各种各样的依赖问题。开发者文档的缺失,没有一个手把手传递上下文的开发,开发环境的初始配置,对于我这样的新人,是非常具有挑战性的。对于一个项目,在进行一段时间之后,非常容易留下初始化的坑,毕竟已经在项目里的人,是跟着项目一起推进的,直到有一个新人加入,才会遇到很多配置上的问题。这篇文章配置过程,全程都是在一台干净的deepin 20.04环境的实体电脑下完成。

对于一个开源项目来说,如果每一个想贡献代码的人,都需要花费数个小时,才能够构建初始环境,是非常痛苦的。更不要说,官网找了好几个链接,都不是真正的项目链接,按照README的流程没有办法从零构建项目。

希望官网以后链接能够及时更新,每个开源的代码库更加独立,每个代码库都有一个开箱即用的开发环境初始脚本。加油!

Reply Favorite View the author
All Replies
andktan
deepin
2022-03-13 07:09
#1

like

Reply View the author
babyfengfjx
Super Moderator
CQA
2022-03-13 07:17
#2
  • 大佬牛皮;
  • 不过大佬描述的这个问题貌似没复现,这个是在几个显示器才会有得?
  • 这个问题已经得到修复了么😄
Reply View the author
lcw0268
deepin
2022-03-13 07:33
#3
It has been deleted!
冒得先生
deepin
2022-03-13 07:53
#4
babyfengfjx
  • 大佬牛皮;
  • 不过大佬描述的这个问题貌似没复现,这个是在几个显示器才会有得?
  • 这个问题已经得到修复了么😄
  • 问题还没有开始定位,更加没开始修,开帖就是为了记录自己第一次试图解决问题的过程。
  • 我的显示器是3×2 排列,6个4k显示器。可能和显示面积过大,或者显示器的排列有关。我有自己用xrandr调整分辨率和显示器排列,可能导致了识别出错。不过目前还没有找到规律。可能需要debug打印一些数值,才能找到问题了。
Reply View the author
HualetWang
deepin
2022-03-13 08:05
#5

提到的问题值得改进 @zccrs

Reply View the author
babyfengfjx
Super Moderator
CQA
2022-03-13 17:35
#6
冒得先生
  • 问题还没有开始定位,更加没开始修,开帖就是为了记录自己第一次试图解决问题的过程。
  • 我的显示器是3×2 排列,6个4k显示器。可能和显示面积过大,或者显示器的排列有关。我有自己用xrandr调整分辨率和显示器排列,可能导致了识别出错。不过目前还没有找到规律。可能需要debug打印一些数值,才能找到问题了。
  • 我嘞个去,这么多显示器😄
  • 大佬的经历非常有价值,望后续能有更多的分享😃
Reply View the author
冒得先生
deepin
2022-03-13 19:38
#7
babyfengfjx
  • 我嘞个去,这么多显示器😄
  • 大佬的经历非常有价值,望后续能有更多的分享😃

bug 找到并且修好了。 窗口位置计算逻辑出错了。MainWindow::eventFilter, "Select the first window where the mouse is located" 下面的代码。有时间我提交PR,有时间后续开帖写过程。

Reply View the author
babyfengfjx
Super Moderator
CQA
2022-03-14 17:21
#8
冒得先生

bug 找到并且修好了。 窗口位置计算逻辑出错了。MainWindow::eventFilter, "Select the first window where the mouse is located" 下面的代码。有时间我提交PR,有时间后续开帖写过程。

  • 好嘞,感谢大佬,V587!
Reply View the author
zccrs
deepin
2022-03-14 21:06
#9

赞,楼主写的很好。我们马上就开始着手把各个项目的readme都更新一下,让它能起到真正的作用

Reply View the author
deepin-superuser
deepin
2022-03-15 05:28
#10

build-dep 这个确实很好用,我一般 sudo apt-get build-dep . 就不需要一个个看报错下载依赖包了

Reply View the author
cope123456
deepin
2022-03-15 05:31
#11

看的津津有味,过程真是一波三折啊,谁能想到有用户会用6块4K的显示屏啊,这得多好的主机才带的动啊。。。

Reply View the author
含光
deepin
2023-11-01 23:14
#12

这个库在哪里下载的,有人知道吗?

Reply View the author