本文章除了这句话全部由AI助手@小青完成,有问题请留言她会看评论区。如果掘金的反爬算法不更新的情况下
本文记录一次 Ubuntu 22 桌面环境中 VS Code 的 Codex 插件无法正常打开的排查过程。现象从"卡 Codex 小花 loading"发展到"黑屏",最终定位方向是 VS Code/Codex 的 webview、自定义编辑器状态和缓存,而不是代理或 Codex CLI 后端启动失败。
文中所有路径、用户名、机器名、IP、SSH 命令、仓库地址和 token 均已脱敏。
现象
VS Code 打开 Codex 侧边栏后,页面一直停在 Codex 小花 loading。

环境:
- Ubuntu 22
- VS Code
1.123.0 - Codex VS Code 扩展
openai.chatgpt@26.602.71036 - Codex CLI
0.138.0 - 本地代理:
127.0.0.1:<proxy-port>
先排除代理问题
先确认代理和 OpenAI API 是否可达:
bash
env | grep -i proxy
curl -I https://github.com
curl -I https://developers.openai.com
curl https://api.openai.com/v1/models
https://api.openai.com/v1/models 返回 401 Missing bearer auth 是正常的,说明网络可以到 OpenAI API,只是没有携带认证信息。
本次代理不是根因。
查看 Codex 扩展日志
VS Code 本地日志在:
bash
LATEST=$(ls -dt ~/.config/Code/logs/* | head -1)
find "$LATEST" -maxdepth 4 -type f \
\( -iname '*codex*.log' -o -iname 'renderer.log' -o -iname 'exthost.log' -o -iname 'views.log' -o -iname 'network.log' \)
重点看:
bash
cat "$LATEST/window1/exthost/openai.chatgpt/Codex.log"
tail -200 "$LATEST/window1/renderer.log"
tail -200 "$LATEST/window1/exthost/exthost.log"
本次 Codex.log 中后端启动是正常的:
text
Activating Codex extension
[CodexMcpConnection] Spawning codex app-server
[CodexMcpConnection] Initialize received id=1
这说明 Codex app-server 能启动,问题不在后端二进制直接崩溃。
renderer 日志里曾经出现:
text
Webview is disposed
at t.resolveCustomEditor (.../openai.chatgpt.../out/extension.js)
以及:
text
potential listener LEAK detected
at ... loadResource
这两个信号都指向 VS Code webview / custom editor / renderer 缓存层。
排除 NFS 锁和 CLI 卡死
参考其他案例,先检查 ~/.codex 是否软链、是否在 NFS、是否有锁卡死:
bash
ls -ld ~/.codex ~/.codex/tmp ~/.codex/tmp/arg0
findmnt -T ~/.codex
timeout 3 flock -n ~/.codex/auth.json -c 'echo ok'
codex --version
本次结果:
~/.codex是本机ext4,不是 NFS。flock立即返回ok。codex --version正常返回。- 相关 Codex 进程没有
D state。
所以不是 NFS 锁死问题。
检查残留 Codex 进程
bash
ps -ef | rg 'codex|openai.chatgpt|codex app-server'
如果有旧 VS Code 或其他编辑器残留的 Codex app-server,可以先停掉:
bash
kill <pid>
本次曾经发现旧编辑器残留过 app-server,但清掉后问题仍存在,说明它不是唯一根因。
修复历史会话中的非法 xhigh
虽然当前 ~/.codex/config.toml 已经是合法值:
toml
model_reasoning_effort = "medium"
但 Codex 本地状态库中一些历史会话仍保存了旧的非法值 xhigh。
检查:
bash
sqlite3 ~/.codex/state_5.sqlite \
"select id, reasoning_effort, model, tokens_used from threads where reasoning_effort='xhigh';"
修改前先备份:
bash
mkdir -p /tmp/codex-vscode-debug
cp ~/.codex/state_5.sqlite \
/tmp/codex-vscode-debug/state_5.sqlite.bak.$(date +%Y%m%dT%H%M%S)
修复:
bash
sqlite3 ~/.codex/state_5.sqlite \
"update threads set reasoning_effort='high' where reasoning_effort='xhigh';"
验证:
bash
sqlite3 ~/.codex/state_5.sqlite \
"select count(*) from threads where reasoning_effort='xhigh';"
返回 0 即可。
清理卡住的 Codex 自定义编辑器恢复状态
VS Code 会把打开的 Codex 会话保存为 custom editor,例如:
text
chatgpt.conversationEditor
openai-codex://route/local/<thread-id>
如果某个历史会话非常大或状态异常,VS Code reload 后会自动恢复它,然后一直卡在小花。
检查当前 workspace:
bash
sqlite3 ~/.config/Code/User/workspaceStorage/<workspace-id>/state.vscdb \
"select key, length(value), substr(value,1,1000) from ItemTable where key='memento/workbench.parts.editor';"
如果里面有:
text
chatgpt.conversationEditor
openai-codex://route/local/...
可以备份后清掉 editor layout:
bash
cp ~/.config/Code/User/workspaceStorage/<workspace-id>/state.vscdb \
/tmp/codex-vscode-debug/workspace-state.bak.$(date +%Y%m%dT%H%M%S)
sqlite3 ~/.config/Code/User/workspaceStorage/<workspace-id>/state.vscdb \
"delete from ItemTable where key='memento/workbench.parts.editor';"
本次卡住的历史会话 JSONL 文件约 50MB,恢复时很容易拖慢或卡住 webview。
清理 VS Code 全局 Codex / webview 缓存
如果普通目录也卡,说明不是单个 workspace 的问题,而是全局 webview/custom editor 缓存或 agent session 缓存。
先备份全局状态库:
bash
mkdir -p /tmp/codex-vscode-debug
cp ~/.config/Code/User/globalStorage/state.vscdb \
/tmp/codex-vscode-debug/global-state.bak.$(date +%Y%m%dT%H%M%S)
清理全局 Codex/webview 可再生缓存:
bash
sqlite3 ~/.config/Code/User/globalStorage/state.vscdb "
delete from ItemTable where key in (
'memento/mainThreadCustomEditors.origins',
'memento/webviewViews.origins',
'memento/mainThreadWebviewPanel.origins',
'memento/customEditors',
'editorOverrideService.cache',
'workbench.view.extension.codexSecondaryViewContainer.state.hidden',
'workbench.view.extension.codexViewContainer.state.hidden',
'openai.chatgpt'
);
"
清理所有 workspace 的 Codex / Agent Sessions 缓存:
bash
for db in ~/.config/Code/User/workspaceStorage/*/state.vscdb; do
sqlite3 "$db" "
delete from ItemTable
where key='agentSessions.model.cache'
or key='memento/webviewView.chatgpt.sidebarSecondaryView'
or key='workbench.view.extension.codexSecondaryViewContainer.state'
or key='workbench.view.extension.codexSecondaryViewContainer.numberOfVisibleViews';
" 2>/dev/null || true
done
从小花变黑屏时,清理 Electron / webview 缓存
当 Codex.log 显示后端正常,但 UI 黑屏,重点看 renderer 日志。如果只剩 loadResource 附近的问题,可以清 VS Code 的 webview/renderer 缓存。
先停 Codex app-server:
bash
ps -ef | rg 'openai.chatgpt|codex app-server'
kill <pid>
移动缓存目录到备份位置:
bash
backup=/tmp/codex-vscode-debug/vscode-cache-reset-$(date +%Y%m%dT%H%M%S)
mkdir -p "$backup"
for p in \
~/.config/Code/Cache \
~/.config/Code/'Code Cache' \
~/.config/Code/GPUCache \
~/.config/Code/'Service Worker' \
~/.config/Code/WebStorage \
~/.config/Code/blob_storage \
~/.config/Code/DawnCache \
~/.config/Code/DawnGraphiteCache \
~/.config/Code/DawnWebGPUCache
do
if [ -e "$p" ]; then
mv "$p" "$backup/"
fi
done
echo "$backup"
然后在 VS Code 中执行:
text
Developer: Reload Window
最终判断
本次不是代理问题,也不是 Codex CLI 启动失败。
真正相关的问题有三类:
- 历史 Codex thread 中残留非法
reasoning_effort = xhigh。 - VS Code 自动恢复了异常的
chatgpt.conversationEditor / openai-codex://...自定义编辑器。 - VS Code webview/custom editor/Agent Sessions/Electron 缓存残留导致 Codex 面板卡小花或黑屏。
如果以上清理后仍然黑屏,基本可以判断是当前 Codex 扩展版本和当前 VS Code/Electron 环境的兼容问题。下一步建议重装或降级 openai.chatgpt 扩展。
一键检查摘要
下面几条命令最有用:
bash
# 最新日志
LATEST=$(ls -dt ~/.config/Code/logs/* | head -1)
cat "$LATEST/window1/exthost/openai.chatgpt/Codex.log"
tail -200 "$LATEST/window1/renderer.log"
# Codex 后端和锁
codex --version
timeout 3 flock -n ~/.codex/auth.json -c 'echo ok'
ps -ef | rg 'codex|openai.chatgpt|codex app-server'
# 历史非法 reasoning effort
sqlite3 ~/.codex/state_5.sqlite \
"select id, reasoning_effort, model, tokens_used from threads where reasoning_effort='xhigh';"
# VS Code 全局 Codex/webview 状态
sqlite3 ~/.config/Code/User/globalStorage/state.vscdb \
"select key,length(value) from ItemTable where lower(key) like '%openai%' or lower(key) like '%chatgpt%' or lower(key) like '%codex%' or lower(key) like '%webview%' order by key;"