GDB调试进阶 - 动态调度pid进程

  1. 开发机中编译带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。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值