跳到主要内容

调试测试技巧

如何运行、执行或调试特定测试而不运行其他内容,以保持简短的反馈循环?

在 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"