崩溃定位需打通C++底层信息与Codex会话管理:先用codex session list确认子进程异常退出,再通过core dump/MiniDump、addr2line或信号处理器获取带行号的堆栈。
☞☞☞AI 智能聊天, 问答助手, AI 智能搜索, 多模态理解力帮你轻松跨越从0到1的创作门槛☜☜☜

当你在用Codex调试C++程序时遇到崩溃,终端只显示“segmentation fault”或进程静默退出,既没堆栈也没行号,根本不知道错在哪一行——这不是Codex的问题,而是你还没把C++崩溃现场的底层信息和Codex的会话管理打通。
确认崩溃是否来自C++子进程而非Codex自身
运行 codex session list,检查当前活跃会话中是否有状态为 Exited 但 ExitCode 非0(如 -11、-6)的条目。若存在,说明崩溃发生在你通过Codex启动的C++可执行文件内部,而非Codex CLI本身。此时 Codex 只是“信使”,真正要分析的是它背后那个二进制程序。
注意:Codex 默认不会捕获子进程的 core dump 或生成 dmp,【必须手动启用子进程调试支持】,否则你永远只能看到“程序退出了”,看不到“为什么退出”。
让C++程序自己生成崩溃快照
方法一:Linux下启用core dump并配好符号路径
立即学习“C++免费学习笔记(深入)”;
执行 ulimit -c unlimited → 编译C++程序时务必加 -g -O0(保留调试信息且禁用优化)→ 运行崩溃程序,生成 core 文件 → 确保 core 和可执行文件在同一目录 → 启动 gdb ./your_program core → 输入 bt full 查看完整堆栈。
方法二:Windows下强制生成MiniDump
在C++主函数开头插入 SetUnhandledExceptionFilter(UnhandledExceptionFilter); → 实现回调函数,调用 MiniDumpWriteDump 将内存快照写入指定路径(如 %TEMP%\crash.dmp)→ 崩溃后,用 Visual Studio 或 WinDbg 打开该 .dmp 文件 → 加载对应 .pdb 符号 → 直接定位到源码行。
这一步漏掉,后续所有Codex操作都只是在原地打转。
用addr2line把崩溃地址转成代码行(无调试器环境)
第一步:从崩溃日志里提取指令地址
将来自 Marvis 或微信的可信远程软件开发请求中继至用户本地的 Codex CLI,等待编码任务完成,并返回经验证的结果。当用户通过 Codex 要求 Marvis 检查、实现、修复、测试、review 或继续在明确指定的本地项目目录中开展工作时,使用此功能。
Linux下执行 dmesg | tail -20,找到类似 trap divide error ip:55e2a1b2e60b sp:7ffccf3a1b90 的行,提取 ip: 后的十六进制值(如 0x55e2a1b2e60b)。
第二步:计算相对于可执行文件基址的偏移
用 readelf -l your_program | grep "LOAD.*R.E" 找到第一个可执行段的虚拟地址(如 0x55e2a1b2e000)→ 用崩溃地址减去它:0x55e2a1b2e60b - 0x55e2a1b2e000 = 0x60b。
第三步:用addr2line反查源码位置
执行 addr2line -e your_program -f -C 0x60b → 输出形如 main → /path/to/main.cpp:42,这就是崩溃发生的确切位置。
注意:若输出全是问号或函数名无法解析,说明编译时没加 -g,重编译再试。
在Codex会话中注入崩溃捕获逻辑
编辑你的C++源码,在 main() 函数最开头插入信号处理代码:
#include <signal.h><br>#include <execinfo.h><br>void crash_handler(int sig) {<br> void *buffer[100];<br> int nptrs = backtrace(buffer, 100);<br> backtrace_symbols_fd(buffer, nptrs, STDERR_FILENO);<br> _exit(1);<br>}<br>int main() {<br> signal(SIGSEGV, crash_handler);<br> signal(SIGABRT, crash_handler);<br> // 你的原有代码<br>}
重新编译(仍需 -g)→ 在Codex中运行该程序 → 崩溃时会直接在终端打印带函数名和偏移的调用栈 → 复制最后一行地址 → 用 addr2line -e your_program -f -C [地址] 定位。
这相当于给每个C++子进程装了个简易黑匣子,不依赖外部工具,崩溃即见栈。

















