背景
在c程序中,除了基本的print,我们最常用的工具就是gdb,它有众多的优点,它能够在程序运行时,打印变量信息,也可以在程序coredump之后,离线调试,可以说,它是排查问题的利器。
gdb基本功能
在函数处打断点,在文件的某一行打断点等等
(gdb) b main
gdb打印数组
在GDB 中执行以下 Python 脚本,这个我也是第一次使用,觉得还是有点惊讶它的调试能力的。
(gdb) python
for i in range(0, 2000):
val = gdb.parse_and_eval("array[%d]->timer_head" % i)
print("array[%d] = %s" % (i, val))
end
watch变量
watch 是 GDB 的 "监视点"(watchpoint) 功能,当某个变量的值被修改时,程序自动暂停,并打印旧值和新值。这比 break + print 更高效,尤其适合追踪"谁改了我的变量"。这个是内存被改,调试的神器。
(gdb) watch variable_name
定时采集变量信息
主要用于跑测试用例的时候,没办法watch变量的情况。
while true; do sudo gdb -p $PID -batch -ex 'print counter' -ex 'detach'; sleep 1; done
总结
gdb 还有很多的调试方法,待后续使用过程中,一一补充。