下面是一个整理和概括了上述内容的完整格式,旨在提供一个清晰的步骤指南,帮助你使用 GDB 调试 C 程序,以及使用 Dune 构建和测试 OCaml 项目。
使用 GDB 调试 C 程序
- 在当前目录编译:
gcc -g example.c -o example
或者指定路径编译:
gcc -g path/example.c -o path_to_where_to_store/example
- 启动 GDB 并加载你的程序:
gdb example
在GDB中设置断点
- 在函数处设置断点,例如 `main`:
break main
- 在指定行设置断点,例如第 10 行:
break example.c : line_number
(gdb) tui enable
gdb tui enable命令在终端中启用了GDB的文本用户界面模式,提供了同时显示源代码和调试信息的功能。
- tui disable:禁用TUI模式,返回到普通的GDB模式。
- info breakpoint:显示所有断点及其位置。
- disable 2:禁用编号为2的断点,但保持其位置不变。
- enable 2:重新启用编号为2的断点。
- clear myFunction:移除函数名为phase01()的断点。
- delete 2:移除编号为2的断点。
- break:在当前行设置一个断点。
- break myFunction
- clear example.c:100
- break lineNumber if condition -- 仅当满足指定条件时,才在指定行号上设置断点
enter 会重复先前的指令
- set args hi bye 2:设置命令行参数为 hi bye 2
- show args:显示当前命令行参数。更改参数需要重新启动程序才能生效
- run:从头开始运行程序。除非设置了断点,否则会一直运行到完成
- kill:终止正在运行的程序。通常用于在出现故障之前重新运行程序
- file program:加载程序并开始调试。方便的重新加载编译后的可执行文件
运行程序
run
终端args
1.gdb xxx args
2.gdb xxx
set args ... -> run
run args
调试中的操作
- 查看变量的值:
print variableName // print /t variable_names ->二进制
- 显示当前函数的局部变量:
info locals
- 显示调用栈:
backtrace
单步执行和继续运行
- 执行下一行(不进入函数内部):
next / next 4
- 如果下一行是函数调用,进入该函数:
step
- 从函数内部返回到函数调用的下一行:
finish
- 继续执行直到下一个断点:
continue
退出 GDB
quit
list -- 显示当前断点附近的源代码,帮助你理解程序的上下文。
修改变量值 -- set var variableName = value
使用 Dune 构建和测试 OCaml 项目
1. 编译
- 在项目根目录下编译 OCaml 项目,检查错误,并验证 `.mli`(接口)文件是否被 `.ml` 文件实现。这将为所有组件生成对应的 `.cma` 和 `.exe` 文件:
dune build
2. 修改后的编译
- 如果你修改了某个 `.ml` 文件,可以单独编译该组件:
dune build xxxxx.cma
- 然后运行对应的 `.exe` 文件:
dune exec xxxxx.exe
3. 运行测试
- 一次性运行所有测试用例:
dune runtest
- 使用 `-w`(watch 模式)自动监视代码变化并重新运行测试:
dune runtest -w
dune runtest -w` 与 `dune runtest` 的区别在于,`-w` 会持续监视代码文件的变化,并在检测到变化时自动重新运行测试用例,而不需要每次手动触发。
终端gdb & dune的入门级应用
于 2024-02-21 04:27:51 首次发布