C/C++ gdb 设置和管理断点

gdb一般命令:
1. (gdb) l:从第一行开始例出原码
2. (gdb) break 1: 设置断点,在源程序第1行处
3. (gdb) info break: 查看断点信息
4. (gdb) r: 运行程序,run命令简写
5. (gdb) n: 单条语句执行,next命令简写
6. (gdb) p i: 打印变量i的值,print命令简写
7. (gdb)bt: 查看函数堆栈
8. (gdb) finish: 退出函数
9. (gdb) c: 继续运行程序,continue命令简写
10. (gdb) q: 退出gdb

GDB 是GNU开源组织发布的一个Linux环境下的程序调试工具,GDB实现一下4个方面功能

(1) 启动程序,可以按照程序员自定义的要求来运行;

  (2)  让被调试的程序在设置的断点处停住,其中断点可以是条件表达式; 

  (3) 检查当程序被停住时所发生的事;

  (4) 动态地改变程序的执行环境;

1. 示例代码

 

2 在程序中加入调试信息

g++ -g -o P20230515 20230515.cpp  , -g表示将源码信息编译到可执行文件中


3 启动和退出GDB调试器

输入gdb进入gdb调试界面,gdb P20230515

 系统会给出GDB的启动信息,显示GDB的版本和版本信息。退出GDB时输入quit。

4 显示和查找程序源代码

list 命令查看所载入的文件。格式如下:

(gdb) list n1,n2

 (gdb) list  11 ,显示11行附近的10行代码,也就是6-15行代码。

5 设置和管理断点

(1) 以行号设置断点

 (gdb) break 15

(2) 查看断点情况

 (gdb) info breakpoint 查看程序中设置的断点

(3)删除断点

disable  让某个断点暂时失效,断点依然存在程序中。

clear  删除程序中的所有断点。

clear 行号 删除此行的断点。

clear 函数名 删除该函数的断点。

delete 断点编号 删除指定编号的断点。

6 执行程序和获取帮助

执行程序 run ,使这个程序以调试模式运行,若想从程序指定行开始运行,可以在后面加上行号。

了解详细信息用 help

help list

 

ps aux | grep P20230515

 

查看进程
USER 进程的属主
PID 进程ID
PPID 父进程
%CPU 进程占用的CPU百分比
%MEM 占用内存的百分比
VSZ 该进程使用的虚拟内存量(KB)
RSS 该进程占用的固定内存量(KB)(驻留中页的数量)
TTY 该进程在哪个终端上运行(登录者终端的位置),若是与终端无关,则显示 '?',若为 ‘pts/0' 等,则表示由网络连接主机的进程
START 该进程被触发启动的时间
TIME 该进程实际使用 cpu 运行的时间
COMMAND 命令的名称和参数

 

STAT:表示进程的当前状态;
以下是进程状态代码:
R:running,运行或可运行状态(在运行队列中)。正在运行或准备运行的进程。
S:interruptable sleeping,可中断睡眠(等待事件完成)。正在睡眠的进程。
D:uninterruptable sleeping,不可中断的睡眠进程(通常为IO)。
T:stopped,停止或被追踪的进程。由作业控制信号停止。
Z:zombie,失败终止的(“僵死”)进程。
s:session leader,会话层状态。代表的父进程
N:低优先级进程
<:高优先级进程
+:前台进程。在前台进程组中
l:多线程进程。

 

linux上进程有5种状态:
1. 运行(正在运行或在运行队列中等待)
2. 中断(休眠中, 受阻, 在等待某个条件的形成或接受到信号)
3. 不可中断(收到信号不唤醒和不可运行, 进程必须等待直到有中断发生)
4. 僵死(进程已终止, 但进程描述符存在, 直到父进程调用wait4()系统调用后释放)
5. 停止(进程收到SIGSTOP, SIGSTP, SIGTIN, SIGTOU信号后停止运行运行)

 

7 控制程序的执行

(1) 单步运行命令

next  一步完成函数调用

setp  进入函数内部

(2) 恢复程序运行

 continue 命令是恢复程序运行,在下一个断点处或程序结束时停止;

 例如:可以多次执行,显示sum和i的值

8 查看和设置变量的值

当程序执行到中断点暂停执行时,查看变量或表达式的值,了解程序的执行状态,发现问题所在。

 用print命令可以查看变量的值,如 print sum

print 变量或表达式:输出变量或者表达式的值。

set variable 变量=值 命令 用来给变量赋值

GDB 的一些常用指令:
run/r–进入调试状态后,运行代码
break/b–设置断点break 12 # 在源码12行设置断点
list/l–显示源代码
continue/c–继续执行直至下一个端点或者结束
print/p–打印变量的值
examine/x–查看指定内存地址中的数据,(只能查看当前被调试程序能够非法访问的地址)
next/n–单步执行命令。

 

quit 退出GDB以后,查看进程

 

 查看数组信息

 

 

在GDB调试过程中,你可以以如下命令显示出这个动态数组的取值:
p *array@len
@的左边是数组的首地址的值,也就是变量array所指向的内容,右边则是数据的长度,其保存在变量len中,其输出结果,大约是下面这个样子的:

print *a@101

 

From https://blog.csdn.net/u012206617/article/details/105413162/

 https://blog.csdn.net/u013069552/article/details/117902245

posted @ 2023-05-24 11:19  jhtchina  阅读(675)  评论(0编辑  收藏  举报