附录5 V调试及错误定位

实际使用V开发的过程中,有时会碰到一些奇怪的,难以定位的报错。

有些是自己代码本身的写法有问题,有一些确实会碰到编译器的bug。

如何快速地对错误进行定位和处理,会节省很多无谓的时间浪费。

从原理上来说V编译器的过程是: V代码=>C代码=>可执行文件。

正常来说V编译器会尽可能地发现编译错误,并给出比较明确的提示哪里出错了。

可是如果V编译器在生成C代码的过程中,生成有错的C代码,导致C编译器编译出错,就需要进一步的调试跟踪选项来定位错误。

vscode调试插件

除了安装V插件外,还需要安装C/C++插件:

https://marketplace.visualstudio.com/items?itemName=ms-vscode.cpptools

安装好C/C++插件后,开始配置:

  • 打开菜单:运行->启动调试,第一次使用会弹出配置环境,配置环境为C++(GDB/LLDB),然后将配置launch.json文件为:

    {
        "version": "0.2.0",
        "configurations": [
            {
                "name": "(lldb) 启动",
                "type": "cppdbg",
                "request": "launch",
                "program":  "${fileDirname}/${fileBasenameNoExtension}", //要改为这个
                "args": [],
                "stopAtEntry": false,
                "cwd": "${fileDirname}",
                "environment": [],
                "externalConsole": false,
                "MIMode": "lldb"
            }
        ]
    }
  • 第一次配置好以后,再次点击运行->启动调试,就会显示调试视图。

  • 在启动调试之前,要先用V编译器把源代码编译为带调试信息的二进制文件,然后再开始启动调试。

    v -g main.v #-g选项就是生成带调试信息的二进制文件

    也可以将编译为带调试信息的二进制文件这一步配置到task.json中,这样就不用每次都用手工输入命令行了。

    {
    			"label": "v build_debug",
    			"type": "shell",
    			"command": "v -g ${file}"
    		},
  • 启动调式后,就可以看到C调试信息的输出。

  • 还可以在代码中插入断点,查看变量值,单步调试等常规调试的操作。

    screenshot visual debugger

clion/idea IDE调试

idea系列中有专门的V语言开发插件:https://github.com/i582/vlang-idea

如果结合clion使用,就可以直接进行调试,并且功能强大,稳定。

C后端调试

常用编译带调试选项:

  • -g

    不做代码优化,加入更多的调试信息在生成的可执行文件中,编译器会强制把v源代码中的行号加入到跟踪堆栈stacktraces中。

    如果启用了-g,断点要打在V源代码上

  • -cg

    不做代码优化,加入更多的调试信息在生成的可执行文件中,编译器会强制把C源代码中的行号加入到跟踪堆栈stacktraces中,一般会配合-keepc使用,每次编译都会保留生成的C源代码。

    如果启用了-cg,断点要打在C源代码上

  • -showcc

    显示使用的C编译器的编译输出

  • -show-c-output

    显示C编译器编译报错时的输出。

  • -keepc

    不删除编译生成的C源代码,方便跟踪调试。

    V编译时生成的C源代码会保存在:

    • 如果设置了VTMP环境变量,会保存在VTMP中V_开头的目录中

    • 如果没有设置VTMP环境变量,则保存在系统临时文件中V_开头的目录中

除了可以使用vscode的C/C++插件进行调试,也可以直接使用命令行调试:

可以使用help子命令查看所有生成C的选项:

js后端调试

要调式生成的js代码,可以激活sourcemap:

可以使用help子命令查看所有生成js的选项:

目前js后端生成的是ES5 strict的代码,ES6的还没有。

native后端调试

目前native后端还在开发中,目前还不支持调试。

最后更新于

这有帮助吗?