Linux下编译xgboost的C++源码并执行单步调试

(作者:陈玓玏)

一、编译xgboost源码

依次在命令行输入以下命令,即可成功编译xgboost源码,编译成功后将生成可执行文件xgboost:

$ git clone --recursive https://github.com/dmlc/xgboost  --克隆
$ cd xgboost  --在xgboost目录下编译
$ make -j4  --编译,会生成可执行文件xgboost,-j4表示开启四个线程,编译速度更快
$ ./xgboost  --运行编译生成的可执行文件

二、单步调试xgboost源码

编译源码是很简单的,但是单步调试有些费劲,找了很多资料,也只找到了一个相关的,并且有些小错误,作为菜鸟的我又从Linux命令查到了gdb查到makefile,终于搞定了。。。分享出来可以成功的方法。以下命令都是在cd xgboost之后,在xgboost路径下执行的。

$ cd xgboost  --打开xgboost目录
$ apt install gdb  --安装gdb调试工具
$ grep '\-O3' -rl -R . |xargs  sed -i 's/-O3/-O0 -g –c –Debug -gdwarf-3/g'
$ sed -i 's/crv/crvs/g' Makefile
$ make –j4

--接下来可以修改一下源代码,比如在main函数里加一句打印输出
$ gdb xgboost  --进入调试
$ set args demo/binary_classification/mushroom.conf  --为cli_main.cc设置输入参数
$ list  --查看代码,也能够看到代码对应行数,方便设置断点
$ b main  --在main函数处设置断点,也可以直接写代码行数
$ r  --开始执行,会在断点处停下来,方便单步跟踪
$ s  --进入代码内部的单步跟踪
$ n  --不进入代码内部的单步跟踪

以上代码的解释如下:

1、 输入grep ‘-O3’ -rl -R . |xargs sed -i ‘s/-O3/-O0 -g –c –Debug -gdwarf-3/g’,这句话的意思是替换所有文件中的-O3为-O0 -g –c –Debug -gdwarf-3。Grep是正则,用于匹配-O3字符串,-r表示从顶层开始匹配所有子文件中的-O3字符串,对多个文件的处理可能不支持,需要用 xargs, 搞定,用sed命令可以批量替换多个文件中的字符串。 sed -i “s/原字符串/新字符串/g” grep 原字符串 -rl 所在目录。替换的字符串部分,-O3表示优化执行,优化的情况下debug会有问题:
1)变量容易被优化而不可见,2)指令编译重排,不容易理解,3)宏定义与inline函数会被优化。
-g参数生成debug符号,-gdwarf-3生成兼容可读的debug symbol文件,如果没有这个参数,gdb print依赖库的变量时会出现错误:error reading variable: Could not find the frame base。本来看了一个教程,是没有加-c –debug的,我加这个的灵感来自于这片文章:https://www.cnblogs.com/caosiyang/archive/2012/06/13/2548051.html,
它让我好好思考了一下这些参数,以及makefile到底是干什么的。

2、 输入sed -i ‘s/crv/crvs/g’ Makefile,这句是对于依赖静态库libxgboost.a改用ar打包参数crvs,否则不能debug静态库源代码。

3、 其实上两步最最主要是要修改makefile,因为用make编译主要是通过makefile,但是我们还应该在源码中稍作修改,打印输出些什么东西,否则使用make编译时不会去检查源码以外文件的改变,刚才做出的这些改变就无意义了。

4、 改好源码之后通过make –j4编译,make即编译,-j4的意思是开辟四个并行,加快速度,写8、12这些都可以,速度更快。

PS:如果不进行以上四步操作,直接在编译过后输入gdb xgboost会出现以下问题,也就是出现红字部分的内容,表示当前可执行文件不能够debug,处于release模式,是不能进行单步跟踪的:
在这里插入图片描述

5、 执行完以上四步操作后再输入gdb xgboost,不出现no debugging symbols found就是可以debug了,这时候你在gdb模式下输入list是可以看到mian函数的内容的,如果不debug,你用list是看不到main函数内容的,而且还会报no such file这类的错。

6、 set args demo/binary_classification/mushroom.conf设置输入参数,参数写在xgboost/demo/binary_classification文件夹下的mushroom.conf文件里,它是xgboost自带的二分类demo。如果不执行这一步,xgboost程序将会因为输入参数不合理直接退出,不会有运行结果。

7、 可以输入list查看main函数的内容,也可以通过b main命令打断点,b是添加断点,mian是函数名,然后输入r,开始跑起来,程序会在断点处挂起,然后通过s或者n单步执行,s是可以看到函数内部的,并且碰到想看的参数,可以print参数,看参数的详细内容。


参考文章,感谢各位大神的分享:

  1. xgboost调试准备:https://blog.csdn.net/matrix_zzl/article/details/78571349
  2. gdb调试指令:https://blog.csdn.net/huqinwei987/article/details/23548239
  3. makefile设置debug和release:https://www.cnblogs.com/caosiyang/archive/2012/06/13/2548051.html
  4. Linux批量替换文件的方法:https://www.cnblogs.com/qq78292959/archive/2012/03/08/2385080.html
  5. xgboost官方文档编译部分:https://xgboost.readthedocs.io/en/latest/build.html

猜你喜欢

转载自blog.csdn.net/weixin_39750084/article/details/83118876
今日推荐