- 开发机中编译带debug信息的动态库
cd jd_search_rank
mkdir debug
cd debug
cmake -DCMAKE_BUILD_TYPE=Debug ..
make
2. 将so文件以及debug版本的源代码上传到预发机中
reload so — 例如,xtest=80
源代码解压到某个目录下 – 例如,/home/admin/yuzhan/jd_search_rank/
3. 查找被删除的临时so文件, 将其恢复
原因:
引擎加载指定的so时, 先将so copy一份,然后再使用copy后的文件,函数退出的时候执行析构再删除该文件;
gdb在编译时会在文件系统内搜索要用的文件;
如果指定so不存在,则只能报栈的调用位置;
如果指定so不是debug版本的,则可知出错的函数名;
如果指定so是debug版本的,则可知函数内出错的行数;
如果预发机上有编译so的源码,则gdb可呈现出错的代码;
因此,我们需要将删除的临时so文件恢复,并且将编译so的源码拷到预发机中。
方法:
ps aux | grep searcher_server – 例如,searcher_server的进程号为16969;
pmap -x 16969 | grep Rank-80.so – 例如,临时so文件名称为 libSearcherRank-80.so_1542968790;
cd 到libSearcherRank-80.so所在目录;
cp libSearcherRank-80.so libSearcherRank-80.so_1542968790。
4. gdb -p 16969
注意,执行命令之后. searcher或者merer进程就被挂起了,无法响应request。
5. 设置源代码路径
编译源码的路径为:/export/users/yuzhan/debug/jd_search_rank;
预发机上源码的路径为:/home/admin/yuzhan/jd_search_rank;
那么要在gdb里设置替换源代码路径,因为存在编译路径不同导致找不到代码目录;
(gdb) set substitute-path /export/users/yuzhan/debug/jd_search_rank /home/admin/yuzhan/jd_search_rank
6. debug
(gdb): b test.cpp:25 (设置断点)
(gdb): continue
发送request,等待gdb断点触发。
调试完成后,退出gdb或者detach。