文章作者:Tyan
博客:noahsnail.com | CSDN | 简书
这篇文件主要介绍如何使用Linux的gdb调试Caffe的源码,源码调试主要是为了阅读并更好的了解Caffe源码。
1. 准备工作
- 首先要在编译Caffe源码时打开debug模式,即将
Makefile.config
中的DEBUG := 1
打开。 - 下载mnist数据集,主要是在mnist数据集上进行调试,执行
bash data/mnist/get_mnist.sh
。 - 转换mnist数据集为LMDB,
bash examples/mnist/create_mnist.sh
。 - 修改
examples/mnist/lenet_solver.prototxt
,将GPU改为CPU。
2. 调试
1. 激活GDB
使用GDB启动调试,执行gdb --args build/tools/caffe train --solver examples/mnist/lenet_solver.prototxt
,--args
表示我们调试时需要输入的参数,调试的命令为build/tools/caffe
,caffe命令的参数为--solver examples/mnist/lenet_solver.prototxt
。
执行结果:
1 | $ gdb --args build/tools/caffe train --solver examples/mnist/lenet_solver.prototxt |
2. 设置断点
执行b src/caffe/layers/base_conv_layer.cpp:117
,b
表示插入断点(breakpoint),断点的位置是base_conv_layer.cpp
文件中的117
行。插入断点的命令形式为:
1 | b path/to/code.cpp:#line |
118行相关代码:
1 | 117 channels_ = bottom[0]->shape(channel_axis_); |
执行结果:
1 | (gdb) b src/caffe/layers/base_conv_layer.cpp:117 |
3. 运行程序
运行程序的命令是r
。
执行结果:
1 | Starting program: /*/caffe/build/tools/caffe train --solver examples/mnist/lenet_solver.prototxt |
Breakpoint 1
之前是正常的程序日志输出,程序在断点处暂停。
查看变量命令为p var
,命令与结果如下:
1 | (gdb) p channels_ |
此时,channels_
值为0
。下一行命令为n
,执行结果如下:
1 | (gdb) n |
此时查看channels_
值为1
,mnist数据是灰度图像,channels_
为1
没问题:
1 | (gdb) p channels_ |
命令c
是继续执行直到下一个断点。
如果需要调试GPU程序,可以使用cuda-gdb
,文档地址为:http://docs.nvidia.com/cuda/cuda-gdb/index.html#axzz4nAAR7ujZ。
参考资料