NOI-Linux 基础教程 2(做题与调试)
本文最后更新于 261 天前,其中的信息可能已经有所发展或是发生改变。

在这篇文章中:

粗体:按钮、菜单的名称
粗体+斜体:视图的名称

1. 创建共享文件夹

可以将宿主机中的一个文件夹或者一个分区共享到虚拟机内,比如将 D 盘下的考生文件 $SD-S00000$ 共享给虚拟机,使得虚拟机可以操作本地文件。

山东考场中的 NOI-Linux 已经配置好了 D 盘的共享文件夹。

选择菜单栏 虚拟机 > 设置 或按下 Ctrl+D。

转到 选项 > 共享文件夹,选择 总是启用,并点击 添加 添加共享文件夹。

打开 Linux 中的 文件,点击左侧的 + 其他位置,选择 计算机,转到 /mnt/hgfs/<共享文件夹名称>,即可看见共享内容。这个文件夹中的内容会与本地磁盘内容 同步读取、存储

建议先在 Windows 下新建好考生文件夹和里面的内容后再在 Linux 中打开,防止出现“路径过长”的警告。

2. 在 NOI-Linux 中编译程序

在程序 cpp 文件所在的文件夹空白处点击右键,选择 在终端打开

现在,假设你有一个名为 $\texttt{hello.cpp}$ 的源文件,则最简单的编译指令为:

g++ hello.cpp -o hello
Bash

当然,这只能简单的将文件编译为二进制。下面是更为高级、通用和实用的编译指令:

g++ < 编译选项 > hello.cpp -o hello
Bash

其中编译选项可以填入:

  • -std=c++14:使用 C++14 标准
  • -O2:开启 O2 优化
  • -g:开启调试选项
  • -Wall -Wextra:对更多内容发出警告,用于检查代码中的一些低级错误(比如 $\texttt{int a == 1}$)
  • -fsanitize=address:(与 -g 不兼容)十分实用的数组越界检测工具,当数组越界时会自动提示
  • -fsanitize=undefined:(与 -g 不兼容)爆 int / long long 检测工具

以下是在 Linux 下常见而在 Windows 下不常见的报错(学有余力):

wrongs.cpp:6:18: error: reference to ‘lock’ is ambiguous
    6 |     scanf("%d", &lock[1]);
      |                  ^~~~

⨽> 变量名 $\texttt{lock}$ 已经在别的地方以别的数据类型以全局变量的方式定义了(如 STL)

wrongs.cpp:10:11: warning: ‘x’ is used uninitialized [-Wuninitialized]
   10 |     printf("%d", x);
      |     ~~~~~~^~~~~~~~~

⨽> 变量名 $\texttt{x}$ 定义为局部变量但是在使用前没有初始化(脏内存)

wrongs.cpp:11:10: warning: suggest parentheses around assignment used as truth value [-Wparentheses]
   11 |     if(x = 1) {
      |        ~~^~~

⨽> 把双等号打成单等号

wrongs.cpp:11:7: warning: statement has no effect [-Wunused-value]
   11 |     x == 1;
      |     ~~^~~~

⨽> 这行语句没有任何作用(大多数情况是把单等号打成双等号)

wrongs.cpp:6:1: warning: no return statement in function returning non-void [-Wreturn-type]
    6 | }
      | ^

⨽> 本应该有返回值的函数没有 return

3. 使用 Code::Blocks 编辑程序

4. 使用 GDB 工具调试程序

假如你用 $\texttt{-g}$ 参数编译了一个程序 $\texttt{hello}$,则在终端输入:

gdb -q hello
Bash

即可开始调试程序。

下面我们以以下的代码作为示例进行调试,

#include <bits/stdc++.h>
using namespace std;

void print2() {
    printf("2");
}

int main() {
    printf("1"); // * Add breakpoint here
    print2();
    for(int i = 3; i <= 5; i++) {
        printf("%d", i);
    }
    return 0;
}
C++

输入 $l$ 可以查看源代码,输入 $b \space 9$ 可以在第 9 行添加断点。

现在,输入 $r$ 就会开始调试,运行到断点处暂停。

输入 $n$ 将执行下一行,输入 $s$ 将尝试进入函数内部,否则执行下一行。

输入 $p \space i$ 可以查看 i 的值。

输入 $u \space 14$ 可以让程序一直执行到第 14 行然后暂停。

下面是一个示例(“...”后面的内容为注解):

(gdb) b 9 ... 在第9行添加断点
Breakpoint 1 at 0x11ca: file wrongs.cpp, line 9.
(gdb) r ... 运行程序
Starting program: /home/zhangborui/OI-Workspace/wrongs 
[Thread debugging using libthread_db enabled]
Using host libthread_db library "/lib/x86_64-linux-gnu/libthread_db.so.1".

Breakpoint 1, main () at wrongs.cpp:9
9           printf("1");
(gdb) n ... 单行调试
10          print2();
(gdb) s ... 进入函数
print2 () at wrongs.cpp:5
5           printf("2");
(gdb) n ... 单行调试
6       }
(gdb) n ... 单行调试
main () at wrongs.cpp:11
11          for(int i = 3; i <= 5; i++) {
(gdb) n ... 单行调试
12              printf("%d", i);
(gdb) p i ... 查看 i 的值
$1 = 3
(gdb) u 13 ... 运行直到第13行
main () at wrongs.cpp:14
14          return 0;
(gdb) n ... 单行调试
15      }
(gdb)
Plaintext

5. 使用集成 IDE 开发环境 —— VSCode

按下键盘上的 Super 键(常被称为 Windows 键),可以打开 活动 视图。输入 vsc 三个字符并按下回车可以快速打开 VSCode。

NOI-Linux 中的 VSCode 版本过低,没有中文语言包,C++ 拓展包也不完整。但是我也要大声的喊出 —— VSCode YYDS!

2.1. 打开文件夹

点击 File > Open Folder / 文件 > 打开文件夹,选择一个文件夹打开(建议在共享文件夹内新建文件夹)。

暂无评论

发送评论 编辑评论


				
上一篇
下一篇