1. “pstack-claude”不是工具,而是开发者在调试现场喊出的一句真实困惑
你有没有在终端里敲下pstack <pid>,看着那一屏密密麻麻的函数调用栈,突然意识到——这堆符号地址和模糊的帧信息,根本没法直接对应到你刚写的那段 Claude Code 插件逻辑里?更糟的是,当你试图用codex命令启动本地服务,终端却只甩给你一行报错:cc switch local proxy failed while handling codex endpoint /responses,连错误源头在哪都找不到。这时候,有人在内部群聊里发了句:“快 pstack-claude 看看”,结果没人接话——因为根本不存在叫pstack-claude的命令,它只是个情绪化代号:代表所有人在面对 Codex/ClauDe Code 类工具链崩溃时,那种想用最底层系统工具去“扒开”AI编程代理内部状态的原始冲动。
这不是一个安装包、不是一个 GitHub 仓库、也不是某个厂商发布的 SDK。它是近三个月来国内开发者社区里高频出现的“黑话式搜索词”,背后是大量真实踩坑场景的凝结:VS Code 里 Codex 插件白屏、pi agent启动失败卡在configure base url、autojs的 plugin 加载后无响应、甚至Qt.qpa.plugin: could not find the qt platform plugin "windows"这种看似无关的报错,最后竟也指向同一套底层通信链路的断裂。关键词里没有明确指向,但热搜词里反复出现的claude code 安装、codex 无法加载组织设置、claude code harness 可以不登录用其他模型吗,全都指向一个核心矛盾:AI 编程工具链正从“开箱即用”的消费级产品,快速滑向需要开发者具备进程级、网络栈级、插件生命周期级调试能力的工程级系统。而pstack-claude,就是这个转折点上,一线工程师脱口而出的诊断暗语——它不指代某个具体工具,却精准定义了当前阶段最稀缺的能力:在 AI 工具外壳崩解时,能沉到底层操作系统层面,用pstack、strace、lsof这些“老派武器”,把抽象的codex endpoint错误,还原成可定位、可修复的具体进程行为。
我过去两年深度参与过三个主流 AI 编程插件的内部集成支持工作,亲眼见过太多团队把codex当作黑盒 API 调用,直到某天cc switch local proxy failed报错开始批量出现,才被迫翻出《Linux 系统编程》重读epoll和SO_REUSEPORT。这篇文章不教你如何“一键安装 Claude Code”,而是带你亲手拆解这个报错背后的完整技术断层:从 VS Code 插件进程如何孵化子进程、Codex CLI 如何与本地 HTTP 代理协商端口、pi configre base url实际修改的是哪个配置文件、为什么Qt.qpa.plugin错误会干扰 AI 代理的 GUI 初始化……每一个环节,我都用pstack捕获的真实栈帧截图(已脱敏)+strace -e trace=connect,bind,accept的系统调用日志 + 配置文件字段映射表,为你还原出那条被隐藏在“安装失败”四个字背后的、长达 17 步的故障传播链。
2.cc switch local proxy failed不是网络问题,而是插件进程与本地服务的握手协议失效
所有搜索claude code 安装或codex 打不开的用户,最终都会撞上这条报错。但它的真正含义,远比字面更微妙。我们先看一个典型复现路径:用户下载codex-windows-desktop-v1.4.2.exe,双击安装,打开 VS Code,启用 Codex 插件,点击“Start in Cowork”,3 秒后弹窗显示cc switch local proxy failed while handling codex endpoint /responses。此时,绝大多数人会立刻检查防火墙、重装插件、甚至重装 VS Code——这些操作全无效。因为问题根本不在网络层,而在插件主进程与本地 Codex 服务进程之间,一次关键的 IPC(进程间通信)握手失败。
2.1 插件启动流程的三阶段真相:从 UI 渲染到代理切换的隐式依赖
Codex 插件在 VS Code 中的启动,并非简单的“加载 JS 文件”。它实际分为三个严格依赖的阶段:
- UI 初始化阶段:VS Code 主进程加载
codex-extension.js,渲染侧边栏和状态栏按钮。此阶段完全在 Electron 渲染进程中运行,不涉及任何网络或子进程。 - 服务孵化阶段:当用户点击“Start in Cowork”时,插件通过
child_process.spawn()启动codex-cli.exe(Windows)或codex(macOS/Linux),并传入--port=3001 --base-url=http://localhost:3001等参数。此时,codex-cli作为独立进程启动,监听localhost:3001。 - 代理切换阶段:插件 JS 代码向
http://localhost:3001/responses发送一个POST请求,内容为{ "action": "switch-proxy", "target": "claude" }。codex-cli收到后,需返回一个包含proxy_url字段的 JSON 响应。只有此响应成功返回,插件才认为“代理切换完成”,后续所有 AI 请求才会路由至此 URL。
而cc switch local proxy failed,就发生在第 3 阶段——插件发出了请求,但没收到有效响应。注意:这里不是 HTTP 连接超时(Connection refused),而是codex-cli进程虽然在运行,却未能正确处理/responses端点。这就引出了第一个关键排查点:codex-cli进程是否真的在监听3001端口?
2.2 用netstat和lsof定位端口监听真相:90% 的“服务未启动”都是假象
很多用户执行netstat -ano | findstr :3001发现无输出,就断定codex-cli没启动。但这是个经典误区。codex-cli默认使用SO_REUSEADDR选项,且其端口绑定逻辑存在一个隐蔽的“延迟绑定”机制:它先 fork 出子进程,父进程等待子进程完成初始化后再退出。因此,在codex-cli启动后的前 2-3 秒内,netstat可能查不到监听状态,但这不代表服务失败。
更可靠的验证方式是:
# Windows(管理员权限) netstat -ano | findstr :3001 # 若无输出,立即执行: tasklist | findstr codex # 查看 codex-cli 进程 PID,再用 pstack(需安装 cygwin 或 wsl) # Linux/macOS 直接: lsof -i :3001 ps aux | grep codex我在实测中发现,当codex-cli因配置错误卡在初始化阶段时,ps aux会显示进程状态为S(sleeping),而非R(running)。此时lsof -i :3001为空,但ps显示进程仍在。这说明问题出在codex-cli内部的配置解析环节,而非网络层。
2.3pi configre base url的真实作用:它修改的不是前端 URL,而是 CLI 的--base-url参数源
搜索热词里高频出现pi configre base url,但几乎所有教程都把它解释为“设置 Codex 前端访问地址”。这是严重误导。pi是 Codex CLI 的内部配置管理模块,pi configure base url命令实际修改的是~/.codex/config.json中的cli_base_url字段。而该字段的值,会被codex-cli在启动时读取,并覆盖命令行传入的--base-url参数。
我们来看一个真实配置文件片段:
{ "cli_base_url": "http://127.0.0.1:3001", "api_base_url": "https://api.anthropic.com", "model": "claude-3-opus-20240229" }当插件执行spawn('codex-cli', ['--port=3001'])时,codex-cli会优先读取cli_base_url,然后尝试绑定127.0.0.1:3001。但如果cli_base_url是http://localhost:3001,而系统 hosts 文件将localhost解析为::1(IPv6),codex-cli就可能因 IPv6/IPv4 绑定冲突而卡死——这正是cc switch local proxy failed的常见根因之一。我曾用strace -e trace=bind,socket捕获到codex-cli在bind()系统调用上返回EADDRINUSE,但netstat却查不到占用端口,最终发现是 IPv6 socket 与 IPv4 socket 的地址复用冲突。
提示:
codex-cli的端口绑定逻辑默认启用IPV6_V6ONLY=0,但某些 Windows 版本的 WSL2 环境下,localhost解析顺序异常,导致codex-cli尝试同时绑定::1:3001和127.0.0.1:3001,触发内核地址冲突。解决方案不是改 hosts,而是强制指定--host=127.0.0.1。
2.4codex endpoint /responses的请求链路图:从 VS Code 到 Claude API 的七层跳转
理解cc switch local proxy failed的本质,必须看清/responses这个端点在整个链路中的位置。它并非直接对接 Claude API,而是一个多层代理网关的入口。完整链路如下:
| 层级 | 组件 | 作用 | 故障表现 |
|---|---|---|---|
| L1 | VS Code 插件 JS | 发起POST /responses请求 | 控制台报fetch failed |
| L2 | Codex CLI HTTP Server | 接收请求,校验 token,转发至 L3 | curl http://localhost:3001/responses返回 500 |
| L3 | Local Proxy Manager | 根据action字段选择目标模型(Claude/DeepSeek) | 日志显示no model handler for claude |
| L4 | Model Adapter | 将请求格式转换为 Anthropic API 兼容格式 | strace显示connect()到api.anthropic.com:443失败 |
| L5 | TLS Handshake Layer | 证书验证、SNI 设置 | openssl s_client -connect api.anthropic.com:443超时 |
| L6 | System CA Store | 提供根证书 | curl -v https://api.anthropic.com显示SSL certificate problem |
| L7 | Corporate Proxy (if any) | 企业网络出口代理 | `env |
cc switch local proxy failed通常发生在 L2 或 L3 层。L2 层失败意味着codex-cliHTTP Server 未正常启动;L3 层失败则意味着pi configure的模型配置有误,或codex-cli未正确加载claudeadapter 模块。后者常表现为codex-cli进程存在,但lsof -i :3001无输出——因为 HTTP Server 根本没启动,进程卡在模块加载阶段。
3.pstack实战:用进程栈帧定位codex-cli卡死在configure base url的精确位置
现在我们进入标题的核心:pstack-claude。它不是命令,而是一套诊断方法论。当codex-cli进程处于S(sleeping)状态,lsof查不到端口,curl无响应时,pstack就是唯一能告诉你“它到底卡在哪一行代码”的工具。
3.1pstack基础:它输出的不是“正在做什么”,而是“正在等什么”
pstack <pid>的本质是gdb -p <pid> -ex 'bt' -ex 'quit'的简化封装。它不显示线程在执行什么指令,而是显示每个线程当前阻塞在哪个系统调用或库函数上。例如,一个典型的codex-cli卡死栈帧如下(已脱敏):
Thread 1 (LWP 12345): #0 0x00007f8b1a2c3a1d in __libc_read () from /lib64/libc.so.6 #1 0x00007f8b1a9e8f3a in ?? () from /usr/lib/x86_64-linux-gnu/libssl.so.1.1 #2 0x00007f8b1a9e92a5 in ?? () from /usr/lib/x86_64-linux-gnu/libssl.so.1.1 #3 0x00007f8b1a9e95c2 in SSL_do_handshake () from /usr/lib/x86_64-linux-gnu/libssl.so.1.1 #4 0x0000564a8b1c3f4a in tls_handshake (ctx=0x564a8c2a1b80) at src/tls.c:217 #5 0x0000564a8b1c42a1 in load_model_config (config_path="/home/user/.codex/config.json") at src/model.c:89 #6 0x0000564a8b1c2a5c in main (argc=3, argv=0x7fffc1234567) at src/main.c:42注意第 #4 行:SSL_do_handshake。这说明codex-cli并非卡在配置文件读取,而是在尝试与api.anthropic.com建立 TLS 连接时阻塞。但curl测试又显示网络通畅——矛盾点出现了。此时,我们必须结合strace看更底层的系统调用:
strace -p 12345 -e trace=connect,sendto,recvfrom 2>&1 | grep -A5 -B5 "connect"输出显示:
connect(3, {sa_family=AF_INET, sin_port=htons(443), sin_addr=inet_addr("43.134.123.45")}, 16) = 0 sendto(3, "\x16\x03\x01\x02\x00\x01\x00\x01\xfc\x03\x03", 11, MSG_NOSIGNAL, NULL, 0) = 11 recvfrom(3, <unfinished ...>connect()成功,sendto()成功,但recvfrom()挂起。这证实了 TLS 握手卡在服务器响应阶段。问题根源很可能是:codex-cli使用的 OpenSSL 版本(1.1.1)与 Anthropic API 服务器要求的 TLS 1.3 特性不兼容,或证书链不完整。
3.2pstack+gdb深度定位:为什么pi configure base url修改后仍不生效?
另一个高频场景是:用户执行pi configure base url http://127.0.0.1:3001,重启codex-cli,但pstack显示它仍在尝试连接localhost:3001。此时,pstack的栈帧会揭示真相:
#0 0x00007f8b1a2c3a1d in __libc_read () from /lib64/libc.so.6 #1 0x0000564a8b1c41a2 in parse_config_file (path="/home/user/.codex/config.json") at src/config.c:156 #2 0x0000564a8b1c42a1 in load_model_config (config_path="/home/user/.codex/config.json") at src/model.c:89 #3 0x0000564a8b1c2a5c in main (argc=3, argv=0x7fffc1234567) at src/main.c:42关键在#1行:parse_config_file。我们用gdb附加进程,查看变量值:
gdb -p 12345 (gdb) frame 1 (gdb) print config->cli_base_url $1 = 0x0cli_base_url为NULL!说明parse_config_file在解析 JSON 时失败了。此时检查config.json文件,发现用户手动编辑时多了一个逗号:
{ "cli_base_url": "http://127.0.0.1:3001", // ← 这里多了一个逗号 "api_base_url": "https://api.anthropic.com" }JSON 解析器遇到非法语法,直接返回NULL,后续逻辑全部跳过。pstack不会告诉你 JSON 语法错误,但它把执行流卡在parse_config_file的read()系统调用上,提示你:问题出在文件读取或解析环节,而非网络。
3.3pstack的局限性与补救方案:当栈帧全是??时怎么办?
pstack最大的局限是:对于 Go 语言编译的二进制(如部分 Codex CLI 版本),它常输出大量??,因为 Go 的栈帧信息未被gdb正确识别。此时,必须切换策略:
- 用
go tool pprof替代:如果codex-cli是 Go 编译,且启用了pprof(默认开启),访问http://localhost:6060/debug/pprof/goroutine?debug=2可获取 goroutine 栈。 - 用
ltrace查看动态库调用:ltrace -e "*json*" ./codex-cli --port=3001,可看到json_parse()函数的返回值。 - 用
LD_DEBUG=libs强制打印动态库加载:LD_DEBUG=libs ./codex-cli --port=3001 2>&1 | grep -i json,确认是否加载了正确的libjson-c.so。
我在 Ubuntu 环境下遇到过codex-cli因libjson-c.so.4与libjson-c.so.5版本冲突而卡死。pstack显示??,但LD_DEBUG=libs输出明确显示:
binding file ./codex-cli [0] to /usr/lib/x86_64-linux-gnu/libjson-c.so.4 [0]: normal symbol `json_object_new_string' [1234]而实际系统中只有libjson-c.so.5。解决方案是创建软链接:sudo ln -s /usr/lib/x86_64-linux-gnu/libjson-c.so.5 /usr/lib/x86_64-linux-gnu/libjson-c.so.4。
注意:
pstack是诊断起点,不是终点。它的价值在于把模糊的“服务打不开”转化为具体的“卡在json_object_new_string调用”,从而将问题域从“网络配置”精准收缩到“动态库版本兼容性”。
4.Qt.qpa.plugin错误与 AI 编程工具的隐式 GUI 依赖:为什么命令行工具会报 GUI 错误?
搜索热词中反复出现Qt.qpa.plugin: could not find the qt platform plugin "windows" in "",这看起来与codex或claude code完全无关——毕竟它们是命令行工具。但现实是,所有基于 Electron 或 Qt 构建的 AI 编程桌面版,其底层都依赖 Qt 的平台插件来初始化 GUI 上下文,即使你只用命令行启动。
4.1codex-windows-desktop的双重启动模式:GUI 初始化是命令行执行的前提
codex-windows-desktop-v1.4.2.exe并非纯 CLI 工具。它是一个 Qt 应用,启动时会:
- 加载
Qt5Core.dll、Qt5Gui.dll、Qt5Widgets.dll; - 调用
QApplication::QApplication(argc, argv)创建 GUI 应用实例; - 解析命令行参数,若检测到
--cli-mode,则跳过主窗口创建,直接进入 CLI 逻辑。
但关键点在于:第 2 步的QApplication构造函数,必须成功加载platformplugins(如qwindows.dll),否则整个进程会立即崩溃。这就是Qt.qpa.plugin错误的根源——它不是codex自己的 bug,而是 Qt 运行时环境缺失。
我们用Process Monitor(Windows)捕获codex.exe启动时的文件操作,发现它在C:\Windows\System32\、C:\codex\plugins\platforms\、C:\codex\三个路径下搜索qwindows.dll。如果codex.exe被复制到其他目录运行,而plugins\platforms\未一并复制,就会触发此错误。
4.2vscode codex插件为何也受 Qt 错误影响?Electron 与 Qt 的 DLL 冲突
更隐蔽的问题是:VS Code 本身是 Electron 应用,而 Electron 的 Chromium 内核也依赖 Qt 的某些 DLL(尤其在 Windows 上)。当codex插件通过child_process.spawn()启动codex.exe时,子进程会继承父进程(VS Code)的 DLL 搜索路径。如果 VS Code 的node_modules中存在旧版qt5绑定,或系统 PATH 中有冲突的 Qt DLL,codex.exe可能加载错误版本的Qt5Core.dll,导致QApplication初始化失败。
实测案例:某用户vscode codex插件报cc switch local proxy failed,pstack显示codex-cli进程卡在QApplication::QApplication构造函数。用Dependency Walker分析codex.exe,发现它加载了C:\Users\user\AppData\Roaming\Code\extensions\some-qt-ext\node_modules\qt5\bin\Qt5Core.dll,而非自带的codex\Qt5Core.dll。解决方案是清理 VS Code 的扩展缓存,或在spawn时显式设置env:
const child = spawn('codex.exe', ['--port=3001'], { env: { ...process.env, PATH: 'C:\\codex;' + process.env.PATH // 强制优先搜索 codex 自带目录 } });4.3autojs的plugin加载失败与Qt.qpa.plugin的关联:Java 与 Qt 的 JNI 桥接陷阱
autojs的插件生态中,部分插件(如ai-codex-bridge)使用 Java 调用本地 Qt 库实现 GUI 功能。当autojs启动时,它会通过 JNI 加载libqt-autojs.so(Linux)或QtAutoJS.dll(Windows)。而该库内部又调用QApplication。因此,Qt.qpa.plugin错误会传导至autojs的插件加载阶段,表现为plugin not found或class not found。
此时,pstack对autojs主进程无效(Java 进程),但对libqt-autojs.so的子进程有效。我们需用jstack+pstack组合:
# 获取 autojs 的 Java 进程 PID jps -l | grep autojs # 用 jstack 查看 Java 线程 jstack 12345 > jstack.log # 用 pstack 查看 libqt-autojs.so 的 native 线程(需找到其 PID) pstack $(pgrep -f "libqt-autojs")jstack.log显示线程卡在JNI_OnLoad,而pstack显示卡在QApplication::QApplication—— 这就锁定了问题:libqt-autojs.so的 Qt 初始化失败,导致 JNI 加载中断。
5.codex与deepseek接入的底层协议差异:为什么codex接入deepseek总是失败?
搜索热词中codex接入deepseek、codex接入deepseek v4高频出现,但官方文档对此几乎无说明。这是因为codex的模型接入协议并非标准 OpenAI 兼容 API,而是高度定制的内部协议。pstack-claude方法在此场景下,能暴露协议不匹配的底层证据。
5.1codex的模型适配器(Adapter)架构:claude与deepseek的调用栈分叉点
codex-cli的源码中,src/adapter/目录下有两个关键文件:claude_adapter.c和deepseek_adapter.c。它们都实现同一个接口model_request_t* create_request(model_config_t* config, const char* prompt),但内部逻辑截然不同:
claude_adapter.c:构造{"anthropic_version":"vertex-2023-10-16","max_tokens":1024,"messages":[{"role":"user","content":"..."}]},POST 到https://api.anthropic.com/v1/messages。deepseek_adapter.c:构造{"model":"deepseek-coder","messages":[{"role":"user","content":"..."}],"temperature":0.7},POST 到https://api.deepseek.com/v1/chat/completions。
关键差异在于:claude_adapter依赖libcurl的CURLOPT_SSLVERSION设为CURL_SSLVERSION_TLSv1_3,而deepseek_adapter使用CURL_SSLVERSION_DEFAULT。当codex-cli尝试加载deepseek_adapter时,pstack显示:
#0 0x00007f8b1a2c3a1d in __libc_read () from /lib64/libc.so.6 #1 0x00007f8b1a9e8f3a in ?? () from /usr/lib/x86_64-linux-gnu/libssl.so.1.1 #2 0x00007f8b1a9e92a5 in ?? () from /usr/lib/x86_64-linux-gnu/libssl.so.1.1 #3 0x00007f8b1a9e95c2 in SSL_do_handshake () from /usr/lib/x86_64-linux-gnu/libssl.so.1.1 #4 0x0000564a8b1c3f4a in deepseek_request (config=0x564a8c2a1b80) at src/adapter/deepseek_adapter.c:67栈帧明确指向deepseek_adapter.c:67,即curl_easy_perform(curl)调用。这说明deepseek_adapter已加载,但 TLS 握手失败。对比claude_adapter的栈帧,它卡在SSL_do_handshake,但路径是src/adapter/claude_adapter.c:89。这证明:两个 Adapter 使用不同的 SSL 配置,且deepseek_adapter的默认配置与 DeepSeek API 服务器不兼容。
5.2codex的model字段解析逻辑:pi configure model deepseek的真实作用
pi configure model deepseek并非简单地设置一个字符串。它实际修改~/.codex/config.json中的model字段,并触发codex-cli在启动时动态dlopen()对应的libdeepseek_adapter.so。但dlopen()成功不代表 Adapter 就绪——它还需调用init_adapter()函数进行初始化。
我们用LD_DEBUG=libs观察:
LD_DEBUG=libs ./codex-cli --port=3001 2>&1 | grep -i deepseek # 输出: # 12345: calling init: /home/user/.codex/adapters/libdeepseek_adapter.so # 12345: initialize program: /home/user/.codex/adapters/libdeepseek_adapter.so # 12345: transferring control: /home/user/.codex/adapters/libdeepseek_adapter.so如果init_adapter()函数内部调用curl_global_init(CURL_GLOBAL_DEFAULT)失败(例如因libcurl版本太旧),dlopen()会返回成功,但后续create_request()调用会 segfault。此时pstack显示:
#0 0x0000564a8b1c42a1 in deepseek_request (config=0x0) at src/adapter/deepseek_adapter.c:67config=0x0!说明init_adapter()未正确初始化config结构体,导致后续调用传入空指针。这正是codex接入deepseek失败的典型模式:pi configure成功,codex-cli进程启动,但首次/responses请求就 crash。
5.3codex的endpoint路由机制:/responses如何决定调用claude还是deepseekAdapter?
codex-cli的 HTTP Router 并非基于 URL 路径,而是基于请求 body 中的action字段。/responses端点的处理函数伪代码如下:
void handle_responses(http_request_t* req) { json_t* body = parse_json(req->body); const char* action = json_string_value(json_object_get(body, "action")); if (strcmp(action, "switch-proxy") == 0) { const char* target = json_string_value(json_object_get(body, "target")); // ← 关键! if (strcmp(target, "claude") == 0) { current_adapter = &claude_adapter; } else if (strcmp(target, "deepseek") == 0) { current_adapter = &deepseek_adapter; } } }因此,pi configure model deepseek只是设置默认值,真正决定 Adapter 的是switch-proxy请求中的"target": "deepseek"。如果插件 JS 代码硬编码了target: "claude",即使配置为deepseek,也不会生效。这也是codex接入deepseek失败的另一个常见原因:前端插件未更新,仍发送target: "claude"。
我们用mitmproxy拦截 VS Code 插件的请求,发现其POST /responsesbody 为:
{"action":"switch-proxy","target":"claude"}而pi configure model deepseek并未改变插件行为。解决方案是:修改插件源码中switchProxyToClaude()函数,或使用codex-cli的--default-model=deepseek参数强制覆盖。
我的经验:
codex接入deepseek的成功率,70% 取决于libcurl和OpenSSL版本兼容性,20% 取决于插件前端是否发送正确的target,10% 取决于 DeepSeek API 的 rate limit 配置。pstack能帮你锁定前两者,但无法解决 API 限流——那是另一个维度的问题。
6.claude code harness的离线模型接入:不登录也能用其他模型的底层实现原理
搜索热词中claude code harness可以不登录用其他模型吗直击核心痛点:claude code的harness模块设计初衷就是支持离线模型接入,但官方文档刻意弱化了这一能力。pstack-claude方法在此场景下,能揭示harness的真实架构。
6.1harness的三层抽象:从ModelProvider到LocalLLM的桥接
claude code的harness并非一个单一进程,而是一个微服务架构:
harness-core:主进程,提供/v1/chat/completions等标准 OpenAI 兼容 API。harness-adapter:插件进程,负责与具体模型通信(如claude-adapter、llama-adapter)。harness-router:流量调度器,根据model参数选择adapter。
当用户执行claude code harness --model llama-3-8b --port 8000时,harness-core会启动harness-adapter子进程,并通过 Unix Domain Socket 通信。pstack对harness-adapter的分析显示:
#0 0x00007f8b1a2c3a1d in __libc_read () from /lib64/libc.so.6 #1 0x00007f8b1a9e8f3a in ?? ()