
GDBGNU DebuggerGNU 调试器是 Linux 下 C/C 语言最常用的命令行调试工具。gcc 负责把 C 代码编译成可执行程序gdb 用来调试这个程序。它能干什么让程序停在指定位置设置断点一行一行执行代码随时看变量、指针、结构体、数组里面的值程序崩溃段错误 segment fault时定位在哪一行代码崩掉可以临时修改内存里变量的值测试不同情况查看函数调用栈看函数是谁调用的。基本操作基本操作:1.list -- 查看当前的代码2.b 行号 --下断点3.r -- run --从头开始运行点到断点处会停4.p 变量名 -- 查看当前的变量5.n -- next ---单步调试6.quit -- 退出reak function_name # 在函数入口设断点 break file.c:42 # 在特定行设断点 run [args] # 启动程序 next / step # 单步跳过 / 进入函数 continue # 继续执行 backtrace / bt # 查看调用栈 frame N # 切换到栈帧 N info locals # 显示当前栈帧的局部变量 print / p expr # 打印表达式值 list # 显示当前位置源码直接查看内存内容x (examine) 是 GDB 查看内存的利刃。 格式x /[个数][格式][大小] 地址 - 格式x(十六进制), d(十进制), s(字符串), i(指令) - 大小b(字节), h(半字2字节), w(字4字节), g(8字节)x为命令符号/区分操作符号和命令符号40代表打印40个单元参数单元格式为b一个字节大小第二个x代表打印的单元数据以十六进制呈现从a[0]这个地址开始访问40个单元的数据Valgrind 是一套动态二进制插桩工具集合最常用的是- Memcheck查内存错误越界、UAF、重复 free、未初始化读、泄漏- Callgrind性能分析函数调用/指令计数配合 kcachegrind- Helgrind /DRD多线程数据竞争/锁问题入门阶段建议只抓住Memcheck 正确编译参数 读懂报告 修复循环。基础指令在指令后添加对应需要编译的文件gcc -g -O0 -fno-omit-frame-pointer -Wall -Wextra main.c foo.c -g //添加调试信息 -O0 //优化级别 不优化 -Wall -Wextra先用编译器把明显问题扫一遍能省大量时间 -fno-omit-frame-pointer让栈回溯更稳定 --帧 基础使用 valgrind ./a.out valgrind 可执行文件最常用指令valgrind --leak-checkfull ./app arg1 arg2 参数解释 --leak-checkfull泄漏细节更全 --show-leak-kindsall显示 definitely/indirectly/possibly/ still reachable --track-originsyes追踪未初始化值来源慢一些但非常值 eg: valgrind --leak-checkfull --show-leak-kindsall --track-originsyes ./a.out