# Nemiver 手册

## 概述

Nemiver 不断致力于编写一个可以和 GNOME 桌面环境良好整合的独立图形化调试器。它目前采用著名的 GNU 调试器 gdb 来调试 C / C++ 程序。

### 视图

Nemiver 被设计成一个通用的图形化工作台与插件系统，可以提供多种不同视图。目前仅提供调试视图，但在将来，可能为使用valgrind的内存调试或者类似oprofile这样的分析工具增加视图。

## 入门

本节解释如何启动 Nemiver 并给出程序的一个概述。

### 启动 Nemiver

您可以用以下方式启动 Nemiver：

应用程序菜单

- 选择编程 Nemiver 调试器。

命令行

- 键入 `nemiver`，然后按回车。

  #### 额外的命令行选项

  您可以通过键入 `nemiver --help-all` 来得到可以用命令行传给 Nemiver 的选项列表。

### Nemiver 窗口

当您启动 Nemiver，您会看到和下图很像的窗口：

#### Nemiver 窗口

Shows Nemiver main window.

Nemiver 窗口包含下列元素：

菜单栏

- 菜单栏中的菜单包含您使用 Nemiver 所需的所有命令。

工具栏

- 工具栏包含基本的调试动作，可以用来运行或单步运行被调试的程序。

源代码视图区域

- 当打开源代码文件时，这个区域将显示被调试的程序的源代码。

状态区域

- 状态区域包含多个标签页，用来显示被调试的程序的信息。它们包括下列内容：

  调用堆栈

- 显示被调试的程序的调用堆栈状态。

变量

- 显示所有局部变量和函数参数列表，此外还有它们的值和类型。

目标终端

- 如果被调试的程序向终端输出任何内容，它会显示在这个标签页中。

断点

- 这个标签页显示所有设置的断点列表。您可以查看特定断点的源代码，双击列表中的项目或者点击右键并从菜单选择转到源代码。此外，可以在这个标签页删除、激活或者禁用断点。更多关于断点的信息请参考nemiver-sect-breakpoints。

寄存器

- 这个标签页显示所有的 CPU 寄存器和它们的值。更多信息请参考nemiver-sect-registers。

内存

- 这个标签页显示特定内存位置的当前状态视图。更多信息请参考nemiver-sect-memory。

### 选择要调试的程序

有多种开始调试程序的方式。Nemiver 允许您载入本地可执行文件、载入核心文件、附到运行的程序中或者连接到远程调试服务器。

#### 调试一个可执行程序

##### 使用工作台

要选择一个可执行程序来调试，选择文件执行...，这会显示下列对话框：

###### 执行对话框

Shows dialog for selecting an executable to run

在这个对话框中，您可以选择要调试的程序、任何要通过命令行传给可执行程序的参数或选项、要运行可执行程序的工作目录以及可执行程序在调试时需要设置的任何环境变量。

##### 使用命令行

要从命令行开始一个准备调试的可执行程序，只需指名可执行程序的名字。您可以给出可执行程序的绝对路径；或者若它在系统路径中，可以仅给出前缀名。例如，如果 `/usr/bin` 在您的系统路径中，下面两种均有效：

- `nemiver /usr/bin/progname`

- `nemiver progname`

###### 在命令行传递选项

如果您希望向调试的程序传递命令行选项，您应将它们放入引号中，以防 Nemiver 运行它们：`nemiver "prognam --arg1 --arg2"`。

#### 附到运行中的程序

##### 使用工作台

选择菜单项目文件附到运行中的程序...，将会显示下面的对话框：

###### 附加对话框

Shows dialog for attaching to a running program

从列表着那个选择一个进程并点击确定以开始调试所选的程序。对话框中可能列出了很多进程，您可以在列表下方的文本框中输入一些文字来过滤出感兴趣的列表。

##### 使用命令行

要从命令行附加到一个运行中的程序，使用 `--attach` 选项。`--attach` 选项接受一个 pid 或者进程名。因此，例如要调试运行中的 `foo` 进程，其 pid 为 1121，您可以键入 `nemiver --attach foo` 或者 `nemiver --attach 1121`。

#### 载入核心文件

##### 使用工作台

选择菜单项目文件载入核心文件...来调出下面的对话框，这将让您加载一个核心文件：

###### 载入核心文件对话框

Shows dialog for loading a core file

##### 使用命令行

核心文件不能从命令行载入。

#### 远程调试

Nemiver 允许您连接到一个远程调试服务器。

##### 使用工作台

要连接到一个远程调试服务器，选择文件连接到远程目标...

Remote Debugging Dialog

选择要载入的可执行程序以及任何共享库的位置，然后填写关于连接到远程服务器的详细信息。

##### 使用命令行

Nemiver 不提供用命令行连接到远程服务器的方法

## 使用 Nemiver

本节介绍如何使用 Nemiver 来调试您的程序。

### 基本的调试动作

基本的调试动作可以在主工具栏、调试菜单和键盘快捷键找到。最常用的动作如下：

继续

- 启动程序。程序会一直运行直到遇到断点或者程序结束，除非被用户通过点击停止来手动中断。这个动作可以通过 F5 键激活。

下一步

- 执行下一条语句，并当到达文件的下一行时停止。一些调试器会称这个动作为“单步执行”。这个动作可以通过 F6 键激活。

进入

- 执行下一条语句，如果可能则进入到函数中。一些调试器会称这个动作为“逐步跳入”。这个动作可以通过 F7 键激活。

跳出

- 结束执行当前函数，并在返回到调用函数时停止。这个动作从可以通过 Shift F7 键激活。

重新启动

- 重新载入当前可执行程序并从开头开始执行。这个动作可以通过 Shift F5 键激活。

停止

- 手动中断程序的执行。这个动作仅在调试器运行可执行程序时能够使用(例如，在用户点击继续之后)。这个动作可以通过 F9 键激活。

默认情况下，Nemiver 在载入可执行程序后会在 `main()` 创建断点。因此，当执行到 `main()`，它会停下来并等待输入。然后您可以逐步运行程序、检查变量(参考nemiver-sect-inspecting-variables)或者设置额外的断点(参考nemiver-sect-breakpoints)。

### 检查变量

Nemiver 在状态区域的变量标签页显示所有局部变量的一个列表。如果您想检查一个不同的变量(甚或任意一个表达式)，您可以使用变量检查器。要调出变量检查器，选择调试检查一个变量。当变量检查器出现时，您会看到类似下图的窗口：

Variable Inspector Dialog

您可以在输入框输入任何变量名或一个简单的表达式(例如 `pFoo->bar`)。如果变量是有效的并在作用域内，它会显示出表达式的详细信息。

或者，如果您在源代码编辑器中选择一个变量的名字，然后运行变量检查器，它会尝试显示所选变量名的信息。

#### 键盘快捷键

您也可以通过按 F12 来启动变量检查器。

Nemiver 会允许您在一个单独的对话框中显示一个应用程序中所有全局变量的列表。要显示全局变量对话框，选择调试显示全局变量或者按 Ctrl G。

Global Variables Dialog

对于一些程序(特别是 C++ 程序)，列出所有全局变量可能会花费很长时间。

### 设置断点

在 Nemiver 中有多种不同方法来设置断点。当您首次开始调试一个新的可执行程序，Nemiver 自动在 `main()` 设置断点。如果您想设置额外的断点，可以执行下列操作之一：

- 点击您要设置断点的行的左边界

- 将光标放到您要设置断点的行，通过选择调试在光标处设置断点，或者按 F8。

- 通过选择调试设置断点...或者按 Ctrl B 以在特定函数名或者位置设置断点。这会调出类似下面的对话框：

  Set Breakpoint Dialog

  您可以在文件的特定位置或通过函数名指定断点。如果多个函数有相同的名字，Nemiver 会显示所有匹配的函数的列表并询问您挑出想要的那个。

#### 禁用的断点

断点可以激活或者禁用。调试器在遇到激活的断点时会停止执行，但不会被任何处于禁用状态的断点影响。这允许您临时移除一个断点而不用实际删除它。

要禁用或激活一个断点，在状态区域的断点标签页中，点击您要激活或禁用的断点标号旁的选框。或者，您可以按 Shift F8 来激活或禁用当前光标所在行的断点。

下面的图显示源代码编辑器中激活的断点和禁用的断点之间的区别。

Illustration of an enabled breakpoint

Enabled Breakpoint

Illustration of a disabled breakpoint

Disabled Breakpoint

#### 打开源代码文件

有时您不能准确知道要设置断点的函数名或者行数，因此必须打开源文件来找出它。您可以从文件系统打开任意文件，但 Nemiver 也提供一个用来构建可执行程序的源文件列表并允许您从中选择。当您选择文件打开源代码文件...，将显示下面的窗口：

Shows dialog for opening source files

要从文件系统选择任意文件，选择从文件系统中选择的选项。要从产生可执行程序的文件列表中选择，选从目标可执行程序选择。

##### 确定动态加载的模块的源文件

如果目标可执行程序来运行时载入模块(例如，使用 `dlopen()`)，Nemiver 无法确定哪些文件被用来构建这些模块，直到它们实际载入。

### 高级调试

#### 寄存器

寄存器编辑部件位于状态区域的寄存器标签页。或者，您可以按 Alt F5 来直接跳到正确的标签页。

The Register Editing Widget

这个部件显示所有 CPU 寄存器的当前值。您可以通过点击值这一列并输入新值来编辑寄存器的值。如果从调试器最后一次停止以来寄存器的值有改变，它会以红色高亮显示。

#### 内存

内存部件允许您直接查看内存的一部分。这使您能对程序运行时所发生的情况得到一个更底层的视图。

The Memory Editing Widget

要在内存视图部件中显示一个内存段，在地址栏中输入一个内存地址。如果地址是对于正调试的程序是有效的，内存视图将显示从指定地址开始的内存值。通过在分组依据下拉菜单中选择选项，内存值可以以字节格式、字格式(2 个字节)，或者长字格式(4 字节)显示。内存值在您单步运行程序时会自动更新。

除了查看内存值，您也可以用内存部件来修改内存值。你可以编辑十六进制的字节表示(内存部件的左手部分)，或者 ASCII 表示(内存部件的右手部分)。所有变化都会立刻应用。

## 会话保存和恢复

Nemiver 可以保存您的调试会话，使您可以在以后恢复它们。这包括保存例如调试了哪个可执行程序、设置了什么环境变量、向可执行程序传递了哪些命令行选项、打开了哪些文件以及设置了哪些断点等信息。这样，您能尽快回到最后一次离开时位置。

### 保存会话

Nemiver 在退出时会自动保存您的会话，所以您甚至不必为此担心。然而，如果您在关闭 Nemiver 前明确保存会话，可以选择文件将会话保存到磁盘。

### 恢复已保存的会话

#### 使用工作台

选择文件恢复保存的会话...并从列表中选择一个会话。

##### 会话对话框

Shows dialog for resuming a saved session

#### 从命令行

如果您知道想要运行的会话的 ID，您可以从命令行启动那个调试会话。例如，如果您想要运行编号为 3 的会话，可以从下面的命令：`nemiver --session 3`。

## 关于 Nemiver

Nemiver 由 Dodji Seketeli 和 Jonathon Jongsma 编写，还有很多其他人的贡献。要获取更多关于 Nemiver 的信息，请访问 Nemiver 项目网站。

要报告关于本应用程序或者本手册的错误或提建议，参见 GNOME 用户指南的反馈部分。

这个程序在由自由软件基金会发布的 GNU 通用公共许可证协议下分发；可以是协议的第 2 版，或任何更高版本(自行选择)。协议副本可以在这个链接中找到，或在程序源代码包的 COPYING 文件中找到。