VSCode使用code-runner运行C++时如何查找错误所在行号?
VSCode Code Runner 运行C++段错误定位行号方法
你看到的/bin/sh: line 1: 87002 Segmentation fault: 11 "/my/path"是操作系统抛出的底层内存错误提示,Code Runner默认只是把终端原始输出透传出来,本身没有错误解析能力,按下面的方法配置就能直接定位到出错行:
方法1:编译时加AddressSanitizer(新手首选,零额外操作)
这是编译器内置的内存错误检测工具,编译时带上对应参数,运行时一旦触发段错误、数组越界、空指针访问、野指针这类问题,会直接打印出错行号、调用栈、错误类型,不用手动进调试器。
- 打开VSCode设置,搜索
Code Runner: Executor Map,点击「在settings.json中编辑」 - 找到C++对应的执行命令,给编译参数加上
-g -fsanitize=address,修改后参考如下:
"cpp": "cd $dir && g++ -g -fsanitize=address $fileName -o $fileNameWithoutExt && $dir$fileNameWithoutExt"
- 保存设置后重新运行程序,触发段错误时终端会直接输出明确的出错代码行、非法内存操作类型。
注:MacOS自带的Clang编译器、Linux下GCC 4.8以上版本都原生支持该参数,不需要额外安装依赖
方法2:用系统自带调试器定位
如果不想每次编译带检测参数,可以用系统自带的调试工具抓取段错误位置:
- 先按上面的步骤给编译命令加上
-g参数,作用是生成带行号、函数名的调试符号,没有这个参数调试器没法把错误地址对应到具体代码行 - 编译生成可执行文件后,在VSCode内置终端进入对应目录:
- MacOS系统执行
lldb ./你的可执行文件名进入调试器 - Linux系统执行
gdb ./你的可执行文件名进入调试器
- MacOS系统执行
- 调试器内输入
run启动程序,复现段错误后调试器会自动暂停,输入bt回车就能打印完整调用栈,栈信息里会明确标注每一层调用对应的代码行号,直接定位出错位置。
为什么Code Runner默认不显示错误行
Code Runner本质是快捷命令执行插件,默认的C++编译参数不带调试符号、没有挂载任何错误检测模块,操作系统返回的段错误信号本身只携带进程ID、错误类型,不关联具体代码行,所以透传出来的信息就只有你看到的那行系统提示。
内容的提问来源于stack exchange,提问作者artisan1218
相关产品推荐
相关产品推荐

