调试测试技巧
如何运行、执行或调试特定测试而不运行其他内容,以保持简短的反馈循环?
在 scripts 文件夹中有一个名为 debug-test.sh 的脚本,它的参数接受一个正则表达式(REGEX)和一个可选的测试编号。
例如,运行以下命令将输出一个交互式列表,您可以从中选择测试。命令格式如下:
debug-test.sh [选项]... <测试正则表达式> <测试编号>
然后它会为您构建并在调试器中运行。
要仅执行测试并获得 PASS 或 FAIL 消息,请运行:
./scripts/debug-test.sh test-tokenizer
要在 GDB 中测试,使用 -g 标志启用 gdb 测试模式。
./scripts/debug-test.sh -g test-tokenizer
# 进入调试器后,即在尖括号提示符处,设置断点可以如下操作:
>>> b main
为了加速测试循环,如果您知道测试编号,可以直接运行,类似于下面的命令:
./scripts/debug-test.sh test 23
如需更多参考信息,请使用 debug-test.sh -h 来打印帮助。
脚本是如何工作的?
如果您想要单独使用脚本中包含的概念,重要的概念在下面简要概述。
步骤 1:重置和设置文件夹上下文
从此存储库的根目录,让我们创建 build-ci-debug 作为我们的构建上下文。
rm -rf build-ci-debug && mkdir build-ci-debug && cd build-ci-debug
步骤 2:设置构建环境并编译测试二进制文件
在调试模式下设置并触发构建。您可以根据需要调整参数,但在这种情况下,这些是合理的默认值。
cmake -DCMAKE_BUILD_TYPE=Debug -DLLAMA_CUDA=1 -DLLAMA_FATAL_WARNINGS=ON ..
make -j
步骤 3:查找所有匹配正则表达式的可用测试
此命令的输出将为您提供运行 GDB 所需的命令和参数。
-R test-tokenizer: 查找所有名为test-tokenizer*的测试文件(R=正则表达式)-N: "仅显示"模式,禁用测试执行并显示可以输入到 GDB 的测试命令-V: 详细模式
ctest -R "test-tokenizer" -V -N
这可能会返回类似于下面的输出(重点关注需要注意的关键行):
...
1: Test command: ~/llama.cpp/build-ci-debug/bin/test-tokenizer-0 "~/llama.cpp/tests/../models/ggml-vocab-llama-spm.gguf"
1: Working Directory: .
Labels: main
Test #1: test-tokenizer-0-llama-spm
...
4: Test command: ~/llama.cpp/build-ci-debug/bin/test-tokenizer-0 "~/llama.cpp/tests/../models/ggml-vocab-falcon.gguf"
4: Working Directory: .
Labels: main
Test #4: test-tokenizer-0-falcon
...
步骤 4:识别用于调试的测试命令
因此,对于上面的测试 #1,我们可以识别出这两个相关信息:
- 测试二进制文件:
~/llama.cpp/build-ci-debug/bin/test-tokenizer-0 - 测试 GGUF 模型:
~/llama.cpp/tests/../models/ggml-vocab-llama-spm.gguf
步骤 5:在测试命令上运行 GDB
基于上面 ctest 的"测试命令"报告,我们可以通过以下命令运行 gdb 会话:
gdb --args ${测试二进制文件} ${测试 GGUF 模型}
示例:
gdb --args ~/llama.cpp/build-ci-debug/bin/test-tokenizer-0 "~/llama.cpp/tests/../models/ggml-vocab-llama-spm.gguf"