0 前言
春节尝试了自己写pytorch模型, 通过我封装的vnc控件,远程docker中的Ubuntu, 采集扫雷游戏的截图, 训练两个模型
- 自定义卷积对游戏截图状态识别
- ddqn 强化学习,仅通过奖励在不教规则的情况下让模型自己学会玩扫雷
前面的识别模型一个星期就成功了,但是强化学习的效果除了花了春节一周时间,还追加了三个星期的周末,都没能成功
不知道是不是强化学习需要的数据量太大导致的,因此只能暂时搁置此学习任务,否则道心不稳,天空好像始终覆盖一层厚重的阴霾
为了走出ddqn的滑铁卢,我把目光转向chromium , 我想编译各平台的精简版本的chromium内核,像electorn一样使用它进行一些web集成到客户端(qt qml 的opengl frame buffer object)中的开发,这样既能享受web前端便利的生态,又能使用qt qml全平台的c++能力,对web在音视频等领域的乏力进行补充.
1 mac os
官方文档
https://github.com/chromium/chromium/blob/main/docs/mac_build_instructions.md
https://bitbucket.org/chromiumembedded/cef/wiki/AutomatedBuildSetup.md#markdown-header-windows-configuration
我们主要完成以下三个步骤
- arm64构建
- x64构建
- 合并为通用的flat版本(x64和arm64都可用)
1.0 源码拉取
1.1 切换sdk
在src/build/config/mac/mac_sdk.gni
里可以确认需要官方编译时的sdk版本
这个版本不一定是要低要救,如果没有这个版本的sdk可以调为你有的版本实验编译,如果编译不过,再安装和他们一样的sdk版本
如果需要安装新的sdk, 可能需要安装对应的xcode版本,在这里下载
什么版本的xcode有什么版本的sdk 看这个说明
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
|
#选择xcode
xcode-select -p
sudo xcode-select --switch /Applications/Xcode.app/Contents/Developer
xcodebuild -showsdks
#查看可用sdk
xcodebuild -showsdks
ls `xcode-select -p`/Platforms/MacOSX.platform/Developer/SDKs/
#查看当前sdk
xcrun --show-sdk-path
xcrun --sdk macosx --show-sdk-version
#临时配置sdk
export SDKROOT=`xcode-select -p`/Platforms/MacOSX.platform/Developer/SDKs/MacOSX13.3.sdk
#编译时配置sdk
cd build && xcodebuild -sdk macosx13.3
#or
#cmake
cmake .. -DCMAKE_OSX_SYSROOT=`xcode-select -p`/Platforms/MacOSX.platform/Developer/SDKs/MacOSX13.3.sdk
#GN
gn gen out/Default --args='mac_sdk_path="`xcode-select -p`/Platforms/MacOSX.platform/Developer/SDKs/MacOSX13.3.sdk"'
|
$ git clone https://chromium.googlesource.com/chromium/tools/depot_tools.git
1
|
$ export PATH="$PATH:/path/to/depot_tools"
|
1.3 获取源码
1
2
3
4
|
$ mkdir chromium && cd chromium
$ caffeinate fetch chromium #防止电脑在拉代码时睡眠
#只拉最新的代码可以用fetch --no-history chromium,想恢复时git fetch --unshallow
#如果网络中断可以不重新开始,使用gclient sync
|
1.4 配置构建参数
https://www.chromium.org/developers/gn-build-configuration/
1
2
|
mkdir -p out/arm64 #name可以是任意的,例如这个目录用于生成arm64,就可以取名为arm64
vim out/arm64/args.gn
|
为了你electorn那样编译精简的版本, args.gn的内容配置为
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
|
chrome_pgo_phase = 0
mac_sdk_path = "/Applications/Xcode16.2.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX15.2.sdk"
#vim "/Applications/Xcode15.2.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX15.2.sdk"
#支持h264,mp3,专利原因默认不开启
ffmpeg_branding = "Chrome"
enable_proprietary_codecs = true
# 关闭调试信息,减小体积
is_debug = false
is_java_debug = false #android Defaults to is_debug.
dcheck_always_on = false
is_official_build = true
is_chrome_branded = false #googler only
symbol_level = 0
blink_symbol_level=0
v8_symbol_level=0
# 关闭组件构建,生成单一二进制文件
is_component_build = false
# 目标平台(根据需求设置)
target_cpu = "arm64" # 或 "arm64"(M1/M2 Mac)
host_cpu = "arm64" # 或 "arm64"(M1/M2 Mac)
#use_jumbo_build=ture #windows上打开这个会编译比较快
# 移除不必要功能
enable_nacl = false
enable_extensions = true # 关闭扩展支持
enable_plugins = true # 关闭 Pepper/Flash 插件
enable_pdf = true # 关闭 PDF 渲染支持
enable_print_preview = true # 关闭打印预览
enable_webrtc = false # 关闭 WebRTC(视频通话)
webrtc_enable_screen_capture = false
enable_spellcheck = false # 关闭拼写检查
enable_reporting = false # 关闭错误报告
enable_mhtml = false # 关闭 MHTML(网页存档)
enable_dbus = false # 关闭 D-Bus(Linux)
# 移除自动更新和远程控制
use_gnome_keyring = false
enable_remoting = false
use_kerberos = false
# 最小化 UI 组件
use_aura = false # 关闭 Aura UI(仅 CLI 程序时)
# osr
#use_ozone = true #linux
enable_osr = true
# 关闭无用的依赖
use_cups = true # 关闭 CUPS 打印支持
use_pulseaudio = false # 关闭 PulseAudio
use_gio = false # 关闭 GIO(Linux 文件管理)
# 进一步裁剪大小
enable_media_router = false # 关闭 Chromecast
enable_resource_allowlist_generation = false # 关闭资源白名单
|
如果需要交叉编译,设置
1
2
3
|
# 目标平台(根据需求设置)
target_cpu = "arm64" # 或 "arm64"(M1/M2 Mac)
host_cpu = "arm64" # 或 "arm64"(M1/M2 Mac)
|
执行配置
1.5 编译
1
2
|
ulimit -n 524288
#防止打开最多文件数量限制
|
如果不需要Ui,只是使用库,则使用content_shell选项编译
1
2
3
|
ninja -C out/Default content_shell
#编译完成后执行启动一个最小化的webview
out/Default/content_shell --disable-gpu
|
删除不需要的静态库和动态库
1
2
3
4
|
strip out/Default/chrome # 去掉调试符号
find out/Default -name "*.a" -delete # 删除静态库
find out/Default -name "*.so" -delete # 删除不必要的动态库
find out/Default -name "*.pdb" -delete # 删除调试符号(Windows)
|
如果需要有编译有ui
1
2
3
4
|
ninja -C out/Default chrome
strip out/Default/chrome # 进一步瘦身
#编译完成后测试执行
out/Default/chrome --no-sandbox --disable-gpu
|
如果要在vs code中编译,创建tasks.jos
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
|
{
"version": "2.0.0",
"tasks": [
{
"label": "build-cotent-shell",
"type": "shell",
"command": "bash",
"args": [
"-x",
"-c",
"ninja -C out/arm64 content_shell"
],
"group": {
"kind": "build",
"isDefault": true
},
"problemMatcher": []
}
]
}
|
在vs code中按command + shift + b 编译
1.5 合并为fat模式(同时支持x64和arm64)
1
2
3
4
5
6
7
|
% ninja -C out/release_x86_64 chrome
% ninja -C out/release_arm64 chrome
% mkdir out/release_universal
% chrome/installer/mac/universalizer.py \
out/release_x86_64/Chromium.app \
out/release_arm64/Chromium.app \
out/release_universal/Chromium.app
|
1.6 调试
如果出现不允许附加进程调试的情况attach failed: Operation not permitted
1
|
echo 0 | sudo tee /proc/sys/kernel/yama/ptrace_scope
|
打断点
1
|
breakpoint set -f inspector_overlay_agent.cc -l 627
|
1.6.1 前置条件
https://chromium.googlesource.com/chromium/src/+/main/docs/lldbinit.md
按上面这个链接设置完后,在命令行执行lldb 可以正常调试chromium里的程序
但在vs code使用codelldb扩展调试时不行,需要在 launch.json中设置加载脚本
1
2
3
4
5
6
7
|
"initCommands": [
"command script import /Users/hbb/source/chromium/chromium/src/tools/lldb/lldbinit.py"
],
"env": {
"CHROME_LOG_FILE": "/tmp/chrome_debug.log",
"CHROMIUM_LLDBINIT_SOURCED": "1",
},
|
编译时,打开 is_debug
,关掉 is_official_build
, symbol_level=2
生成一下有调试符号的程序,才能调试
生成compile_command.json后, 设置到 IDE中, 用于ide符号跳转
调试时通过命令行传参 --no-sandbox
,关掉沙箱,否则调试可能会不正常
1.6.2 调试主进程
创建vs的调试用的launch.json
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
|
{
"version": "0.2.0",
"configurations": [
{
"name": "Debug Content Shell",
"type": "lldb",
"request": "launch",
"program": "${workspaceFolder}/out/arm64/Content Shell.app/Contents/MacOS/Content Shell",
"args": [
"--no-sandbox",
"--disable-logging",
"--off-screen-rendering-enabled",
"--v=0",
"--remote-debugging-port=9222"
],
"cwd": "${workspaceFolder}",
"env": {
"CHROME_LOG_FILE": "/tmp/chrome_debug.log",
"CHROMIUM_LLDBINIT_SOURCED": "1",
},
"stopOnEntry": false,
"initCommands": [
"command script import /Users/hbb/source/chromium/chromium/src/tools/lldb/lldbinit.py",
"command script import /Users/hbb/source/chromium/chromium/src/tools/lldb/chromium_visualizers.py"
],
"postRunCommands": [
"image list" // 可选:启动后列出加载的模块
]
//"sourceMap": {
// "/b/s/w/ir/cache/src": "${workspaceFolder}" // 替换为调试信息中的源码路径
//},
//"preLaunchTask": "build",
}
]
}
|
如果要在命令行使用lldb调度时传入参数
1
|
lldb -- out/arm64/Content\ Shell.app/Contents/MacOS/Content\ Shell -- --no-sandbox --disable-logging --off-screen-rendering-enabled --v=0 --remote-debugging-port=9222
|
1.6.3 调试子进程
调试子进程,只能使用附加进程的方式
1
2
|
lldb
(lldb) attach -p 12345
|
content shell 启动后,打开百度
使用 ps 观察启动了几个线程
1
2
|
ps aux|grep chromium
#启动了3个渲染进程,1个gpu进程,一个网络进程,一个存储进程
|
按需要附加进程即可
如果要用vs code调试,在launch.json中添加一个配置
在program中写入想调试的进程的路径,
如果只有一个进程,可以使用 "program": "path to executanble"
指定 调试的程序路径,
或使用"processId": "${command:pickProcess}"
选择一个进程
如果有多个进程,只能使用"pid": "25951"
指定具体的pid 附加某个进程调试
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
{
"name": "attach to Content Shell",
"type": "lldb",
"request": "attach",
//"program": "${workspaceFolder}/out/arm64/Content Shell.app/Contents/MacOS/Content Shell",
//"program": "${workspaceFolder}/out/arm64/Content Shell.app/Contents/Frameworks/Content Shell Framework.framework/Helpers/Content Shell Helper (Renderer).app/Contents/MacOS/Content Shell Helper (Renderer)",
//"processId": "${command:pickProcess}",
"pid": "25951",
"cwd": "${workspaceFolder}",
"initCommands": [
"command script import /Users/hbb/source/chromium/chromium/src/tools/lldb/lldbinit.py",
"command script import /Users/hbb/source/chromium/chromium/src/tools/lldb/chromium_visualizers.py"
],
"postRunCommands": [
"image list" // 可选:启动后列出加载的模块
]
//"sourceMap": {
// "/b/s/w/ir/cache/src": "${workspaceFolder}" // 替换为调试信息中的源码路径
//},
}
|
如果想自动附加调试, 设置
在主程序的配置中设置 "settings set target.process.follow-fork-mode child"
并不能生效,因为设置这个需要先有断点信息,再设置settings set target.process.follow-fork-mode child
1
2
3
4
5
|
"initCommands": [
"settings set target.process.follow-fork-mode child",
"command script import /Users/hbb/source/chromium/chromium/src/tools/lldb/lldbinit.py",
"command script import /Users/hbb/source/chromium/chromium/src/tools/lldb/chromium_visualizers.py"
],
|
vs code有一个lldb的扩展,通过监视进程自动附加
https://marketplace.visualstudio.com/items?itemName=thebestnom.auto-attach-child-processes
或者手动在lldb 调试控制台录入settings set target.process.follow-fork-mode child
总结,还是自己使用lldb 控制台控制比较合理,因为如果有多个子进程, 用插件始终只能附加到第一个子进程
>> Home
Comments