CodeRoadMap
首页路线题库资源库文章社区
CodeRoadMap

程序员的学习成长路线图。内容免费开放,登录后可同步路线图与课时进度。

由 程序员柏风 独立维护 · 关于作者

学习

  • 路线图
  • 课程
  • 面试题
  • 文章
  • 我

更多

  • 资源
  • 社区
  • 关于作者
  • 内容说明

© 2026 CodeRoadMap

津ICP备2026012044号-1·津公网安备12011002026155号·coderoadmap@126.com
C 语言入门/课时/调试与测试
RawBlame
课时目录12 节

C 语言入门

  1. 01C 是什么
  2. 02类型与变量
  3. 03控制流与运算符
  4. 04函数
  5. 05指针与内存
  6. 06数组与字符串
  7. 07结构体与联合体
  8. 08预处理器
  9. 09编译与构建
  10. 10并发与进程
  11. 11调试与测试
  12. 12综合练习

调试与测试

GDB、Valgrind、ASan、cmocka。

35 分钟

调试与测试

GDB 断点、Valgrind 内存检查与 cmocka 单元测试,是写出可靠 C 代码的三件套。对照 /roadmaps/c,本课覆盖常见工具链用法。

学习目标

  • 用 GDB 设断点、单步、查看变量
  • 了解 Valgrind 与 AddressSanitizer
  • 编写 cmocka 风格的基本测试
  • 建立「先失败用例再修复」的习惯

核心概念

GDB 调试

gcc -std=c11 -g -O0 -Wall app.c -o app
gdb ./app
(gdb) break main
(gdb) run
(gdb) next          # 单步跳过函数
(gdb) step          # 单步进入函数
(gdb) print x       # 查看变量
(gdb) backtrace     # 调用栈
(gdb) continue

示例程序与 ASan

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int sum_array(const int *arr, int n) {
    int total = 0;
    for (int i = 0; i < n; i++) {
        total += arr[i];
    }
    return total;
}

/* 故意留 bug 供调试练习 */
char *broken_copy(const char *src) {
    char *dst = malloc(strlen(src));  /* 少分配 1 字节 */
    strcpy(dst, src);
    return dst;
}

int main(void) {
    int data[] = {1, 2, 3, 4, 5};
    printf("sum=%d\n", sum_array(data, 5));

    char *s = broken_copy("debug");
    printf("copy=%s\n", s);
    free(s);
    return 0;
}
# AddressSanitizer 抓越界/泄漏
gcc -std=c11 -g -fsanitize=address app.c -o app_asan
./app_asan

cmocka 测试(概念)

#include <stdarg.h>
#include <stddef.h>
#include <setjmp.h>
#include <cmocka.h>

static void test_sum(void **state) {
    (void)state;
    int arr[] = {1, 2, 3};
    assert_int_equal(sum_array(arr, 3), 6);
}

int main(void) {
    const struct CMUnitTest tests[] = {
        cmocka_unit_test(test_sum),
    };
    return cmocka_run_group_tests(tests, NULL, NULL);
}

类似 JUnit 的 assertEquals;C 项目常在 CI 中跑测试 + ASan 构建。

与 C++/Java 对照

工具CC++Java
调试器GDB / LLDB同左jdb / IDE
内存检查Valgrind、ASan同左GC + 有限工具
单元测试cmocka、UnityGoogle TestJUnit
覆盖率gcov、lcov同左JaCoCo

Java 有 JVM 兜底部分错误;C 越界可能静默破坏内存,必须依赖工具与规范。

练习

  • 对 sum_array 在 GDB 中设断点,单步观察 total
  • 用 ASan 编译 broken_copy,阅读报错并修复
  • 为 sum_array 写 3 个测试:空数组、负数、正常
  • 说明 Valgrind 与 ASan 各自适用场景

小结

调试器查现场,测试防回归,ASan/Valgrind 抓内存错。 下一课综合练习。

加载本节练习…
← 上一课并发与进程下一课 →综合练习