做编译器开发的经常会遇到各种问题,有些问题又不是很容易发现而且网上关于gdb调试clang的文章很少,下面简单介绍一下用gdb调试clang供大家学习。
1.首先输入gdb进入调试模式
2.打开要调试的clang可执行文件,通过file命令:
等待一会儿将会显示Reading symbols from ~/llvm3.8/bin/clang...done字样
3.设定调试子进程,clang会派生一个新的进程来执行编译流程,set follow-fork child
4.设置断点
我们在SemaDecl.cpp中的第11377行设置断点
5.执行编译
r test.c,其中test.c是传递给clang的参数
我们查看一下当前编译器处理的函数体的函数名字输入p FD->getNameAsString()发现是main函数
然后输出c继续执行,再次输出p FD->getNameAsString()发现此时处理的是fun1函数
先暂时说这么多,关于gdb调试其他命令例如如何一行一行执行,设置观察到等等网上能搜到我就不多说了。
附:
gdb调试常用命令
(gdb) start //开始调试
(gdb) n //一条一条执行
(gdb) step/s //执行下一条,如果函数进入函数
(gdb) backtrace/bt //查看函数调用栈帧
(gdb) info/i locals //查看当前栈帧局部变量
(gdb) frame/f //选择栈帧,再查看局部变量
(gdb) print/p //打印变量的值
(gdb) finish //运行到当前函数返回
(gdb) set var sum=0 //修改变量值
(gdb) list/l 行号或函数名 //列出源码
(gdb) display/undisplay sum //每次停下显示变量的值/取消跟踪
(gdb) break/b 行号或函数名 //设置断点
(gdb) continue/c //连续运行
(gdb) info/i breakpoints //查看已经设置的断点
(gdb) delete breakpoints 2 //删除某个断点
(gdb) disable/enable breakpoints 3 //禁用/启用某个断点
(gdb) break 9 if sum != 0 //满足条件才激活断点
(gdb) run/r //重新从程序开头连续执行
(gdb) watch input[4] //设置观察点
(gdb) info/i watchpoints //查看设置的观察点
(gdb) x/7b input //打印存储器内容,b--每个字节一组,7--7组
(gdb) disassemble //反汇编当前函数或指定函数
(gdb) si // 一条指令一条指令调试 而 s 是一行一行代码
(gdb) info registers // 显示所有寄存器的当前值
(gdb) x/20 $esp //查看内存中开始的20个数