GDB调试C++代码-条件断点与断点读写

GDB调试C++代码-条件断点与断点读写

一、条件断点

学习开源软件调试源码时,尤其是服务端程序,面对不同的客户端消息,经常需要消息过滤,此时就会用到条件断点。

条件断点格式:b 断点位置 if 条件表达式

以之前的TCP服务端代码为例,当客户端发送"hello"时,在服务端打印客户端发送内容前的代码处增加断点
1、开始调试并且添加断点:gdb --args ./Server 6000
添加断点:b TcpServer.cpp:98 if 0==strcmp(recvBuf,“hello”)
GDB调试C++代码-条件断点与断点读写
2、客户端发送示例:
(1)./Client 127.0.0.1 6000 “hello this is a client”
(2)./Client 127.0.0.1 6000 “hello”
GDB调试C++代码-条件断点与断点读写
3、服务端只有在收到"hello"时才会进入断点:
GDB调试C++代码-条件断点与断点读写

二、断点读写

学习开源软件调试源码时,经常需要分析软件调用流程。因为不会修改代码,所以可以将调试的断点保存到本地,后续重新调试时直接加载保存的断点文件即可,不用每次都重新输入断点。
以之前的TCP客户端代码调试为例

1、开始调试并且添加断点:gdb --args ./Client 127.0.0.1 6000 “hello this is a client”
添加两个断点:
(1)b 16
(2)b TcpClient.cpp:TcpClient::SenMsgGDB调试C++代码-条件断点与断点读写
2、保存断点到/tmp/client.break文件:save b /tmp/client.break
GDB调试C++代码-条件断点与断点读写
查看断点文件内容:
GDB调试C++代码-条件断点与断点读写
3、清空断点并且加载断点文件及查看断点:source /tmp/client.break
GDB调试C++代码-条件断点与断点读写

三、调试运行的进程

以TCP服务端为例
1、后台启动进程:nohup ./Server 6000 >> /dev/null 2>&1 &
2、查看进程ID:ps -aux|grep Server
GDB调试C++代码-条件断点与断点读写
3、调试运行进程并且设置断点:gdb attach 4653(进程ID)
(1)gdb attach 4653
(2)b TcpServer.cpp:98
(3)c(继续运行程序)
GDB调试C++代码-条件断点与断点读写
4、客户端发送示例:./Client 127.0.0.1 6000 “hello”
GDB调试C++代码-条件断点与断点读写
5、服务端运行情况:
GDB调试C++代码-条件断点与断点读写