QtWebEngine使用时DevToolsActivePort文件未生成如何解决
QtWebEngine 对原生Chromium的远程调试逻辑做了封装裁剪,仅设置QTWEBENGINE_REMOTE_DEBUGGING环境变量时,不会触发Chromium原生的DevToolsActivePort文件写入逻辑,因此会抛出QtWebEngine: DevToolsActivePort file is missing报错。该文件不自动生成的核心原因是Qt默认使用隔离的临时用户数据目录运行Chromium渲染进程,没有给Chromium传入固定可写的用户数据路径,Chromium没有对应路径的写入权限,无法生成存储调试端口信息的文件。
方案1:通过环境变量配置(适用于第三方QtWebEngine应用使用者)
启动应用前同时配置两个环境变量,显式指定固定调试端口+可写的Chromium用户数据目录,不要使用随机端口:# Linux/macOS 终端执行 export QTWEBENGINE_REMOTE_DEBUGGING=9222 export QTWEBENGINE_CHROMIUM_FLAGS="--user-data-dir=/home/yourname/custom_webengine_profile"# Windows CMD 执行 set QTWEBENGINE_REMOTE_DEBUGGING=9222 set QTWEBENGINE_CHROMIUM_FLAGS="--user-data-dir=C:\Users\yourname\custom_webengine_profile"配置完成后启动应用,保证当前运行用户对指定的
custom_webengine_profile目录有完整读写权限,DevToolsActivePort文件会自动生成在该目录的根路径下,文件第一行为调试端口,第二行为调试服务的websocket路径。方案2:代码层面配置(适用于QtWebEngine应用开发者)
不需要依赖系统环境变量,在QApplication实例初始化前主动注入启动参数即可,示例代码如下:#include <QApplication> #include <QtWebEngine> int main(int argc, char *argv[]) { // 注意:所有WebEngine相关环境变量必须在QApplication创建前设置 qputenv("QTWEBENGINE_REMOTE_DEBUGGING", "9222"); qputenv("QTWEBENGINE_CHROMIUM_FLAGS", "--user-data-dir=./app_webengine_profile"); QApplication app(argc, argv); QtWebEngine::initialize(); // 其余业务逻辑 return app.exec(); }应用首次启动后,会在运行路径下自动创建
app_webengine_profile目录,DevToolsActivePort文件就存放在该目录内。方案3:手动补全文件(适用于无权限修改启动参数的场景)
如果无法修改应用的启动配置,可以先通过端口扫描工具确认QTWEBENGINE_REMOTE_DEBUGGING指定的调试端口已经被QtWebEngine进程正常监听,再找到应用默认使用的QtWebEngine数据目录,手动创建DevToolsActivePort文件,文件内容格式如下:9222 /devtools/browser/xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx第一行替换为实际监听的调试端口,第二行可以随便填一个32位长度的十六进制字符串,不影响本地调试连接。
注意:
QTWEBENGINE_REMOTE_DEBUGGING参数会开放Chromium远程调试端口,存在未授权访问导致任意代码执行的风险,仅可在本地开发调试场景开启,禁止在生产环境配置。
内容的提问来源于stack exchange,提问作者Pikkostack

