gdb调试已在运行中的进程


一、在服务器上调试进程,服务器上并没有源代码,所以需要将源码上传至服务器,才能调试看到源码,以下是步骤:

1、查看服务进程id:pgrep 服务名

[user@user-MP app]$ pgrep progream_svr
5111

2、启动gdb:gdb progream_svr 5111

3、设置源码映射

set substitute-path /home/ahwen/workspace/PssSeatDcs/Pss_Seat_Cstl /home/tode/others/others/Pss_Seat_Cstl

源码路径:/home/ahwen/workspace/PssSeatDcs/Pss_Seat_Cstl

实际代码路径:/home/tode/others/others/Pss_Seat_Cstl

用实际代码替换源码,此过程需要包版本和代码版本一致。

4、设断点:

b TmXxxCondition.cpp:128

调试文件:TmXxxCondition.cpp

断点:128行

5、已是运行中的程序不需要启动(r),继续(c)即可。

6、等待指令或报文触发断点,被击中会停留在断点行。

二、gdb常用指令:

gcc -g  main.c                      //在目标文件加入源代码的信息
gdb a.out       

(gdb) start                         //开始调试
(gdb) n                             //一条一条执行
(gdb) step/s                        //执行下一条,如果函数进入函数
(gdb) backtrace/bt                  //查看函数调用栈帧
(gdb) info/i locals                 //查看当前栈帧局部变量
(gdb) frame/f                       //选择栈帧,再查看局部变量
(gdb) print/p                       //打印变量的值
(gdb) finish                        //运行到当前函数返回
(gdb) set var sum=0                 //修改变量值
(gdb) list/l 行号或函数名             //列出源码
(gdb) display/undisplay sum         //每次停下显示变量的值/取消跟踪
(gdb) break/b  行号或函数名           //设置断点
(gdb) continue/c                    //连续运行
(gdb) info/i breakpoints            //查看已经设置的断点
(gdb) delete breakpoints 2          //删除某个断点
(gdb) disable/enable breakpoints 3  //禁用/启用某个断点
(gdb) break 9 if sum != 0           //满足条件才激活断点
(gdb) run/r                         //重新从程序开头连续执行
(gdb) watch input[4]                //设置观察点
(gdb) info/i watchpoints            //查看设置的观察点
(gdb) x/7b input                    //打印存储器内容,b--每个字节一组,7--7组
(gdb) disassemble                   //反汇编当前函数或指定函数
(gdb) si                            // 一条指令一条指令调试 而 s 是一行一行代码
(gdb) info registers                // 显示所有寄存器的当前值
(gdb) x/20 $esp                    //查看内存中开始的20个数


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM