工具知识 | gdb使用相关知识
gdb使用相关知识
-
什么是
参考答案gdb
?gdb
全称为GNU Debugger
,是可以运行于多种类Unix平台的程序调试软件。类似的软件还有lldb
,lldb
常用于macos
。参考资料:
-
gdb常见命令有哪些?
参考答案gdb的常见命令有:
- help: 获取gdb命令帮助
- help
<command>
: 获取特定gdb命令的帮助 - run: 运行到下个断点或程序结束
- step: 单步(逐语句)调试,会进入到函数内部执行
- next: 单步(逐语句)调试,但不会进入到函数内部执行
- finish: 结束当前函数或循环
- continue: 执行到下个断点或程序结束
- up
<N>
: 往栈顶移动N
帧,N
默认为1 - down
<N>
: 往栈顶移动N
帧,N
默认为1 - list: 打印当前点附近的代码
- print
<name>
: 打印名为name
的变量值 - print *
<name>
: 打印name
指针指向的值 - print/x
<name>
: 以16进制打印name
的值 - print
<name>
@<n>
: 打印以name
为起始地址的n
个值 - break
<name>
: 在函数name
处设置断点 - break
<num>
: 在行num
处设置断点 - disable 1: 去使能断点1
- enable 1: 使能断点1
- delete 1: 删除断点1
- delete: 删除所有断点
- condition 1
<expr>
: 断点1的停止条件为表达式expr
为true - condition 1: 删除断点1的所有条件
- info break: 显示所有的断点信息
- backtrace: 查看栈信息
- display
<name>
: 始终显示变量name
的值 - undisplay
<name>
: 取消跟踪name
的值 - watch
<expr>
: 监视expr
的值,一旦有变化就暂停程序
参考资料:
-
gdb调试的原理是?
参考答案gdb
使用系统调用ptrace
(process trace)去观察和控制其它进程的执行、检查和修改其它进程的内存和寄存器。ptrace
的原型如下:long ptrace(enum __ptrace_request request, pid_t pid, void *addr, void *data);
根据
ptrace
的manual手册,主要有两种跟踪进程的方式:-
父进程通过
fork
系统调用创建子进程,在子进程中作如下ptrace
调用,然后再通过execv
加载子进程程序。ptrace(PTRACE_TRACEME, 0, 0, 0);
-
使用如下
ptrace
调用直接跟踪其它进程:ptrace(PTRACE_ATTACH, pid, 0, 0);
当进程被跟踪时,每当有信号(signal)被分发给被跟踪的进程(tracee)时都会导致tracee暂停(
SIGKILL
是个例外)。进行跟踪的进程(tracer)通过waitpid
系统调用(或类似的wait
相关的系统调用)获知tracee
被跟踪的情况。当tracee停止时,tracer还可以使用多种ptrace request
去检查或修改tracee
。gdb断点(breakpoint)功能的软件实现原理是在指定位置插入断点指令(INT),当被调试的程序执行到断点位置时,产生
SIGTRAP
信号并转由gdb处理。参考资料:
-
-
如何调试
参考答案多进程
程序?当我们使用
gdb
调试多进程程序时,如果进程使用fork
创建了子进程,gdb
仍会继续跟踪原来的进程,子进程正常执行。要想允许调试子进程,有两种方法:- 使用
attch pid
的方式跟踪子进程,其中pid
为子进程的进程ID - 在
gdb
中使用set follow-fork-mode
配置fork
时跟踪子进程还是父进程
参考资料:
- 使用
-
如何调试
参考答案多线程
程序?gdb
提供以下功能调试多线程程序:- 新线程创建的自动提醒
thread <threadno>
命令用于在调试的进程间切换info threads
命令用于查询所有已存在的线程thread apply <threadno> <all> args
命令用于对指定的一条线程或多条指令应用指令- 用于线程的断点
需要注意的是,
threadno
是gdb
为每个线程分配的线程ID,是一个内部ID参考资料:
-
什么是
参考答案core
文件?有什么作用?core
文件指core dump file
,是操作系统在进程收到某些信号而终止时,将此时进程空间的内容及有关进程的状态的其它信息写入一个磁盘文件。core
文件中的信息一般用于调试。 程序自身的core dump file
一般可以用于分析程序是在哪里错了,而外部程序触发的core dump file
一般来于分析进程的运行情况,比如分析内存使用、线程状态等。core dump
的缺点有:- 性能问题:对进程进行core dump可能会耗费大量系统资源、造成内存清理的延迟,尤其是占用大量内存的进程。
- 磁盘空间问题:对进程进行core dump会占用大量磁盘空间。
- 安全问题:core文件可能包含敏感数据(如密码和密钥),这部分敏感数会被写入到磁盘。
Linux上要去使能core dump功能,有以下方式:
- 使用
sysctl
设置kernel.core_pattern
的值为/dev/null
- 按如下方式配置
/etc/systemd/coredump.conf.d/custom.conf
:
```
[Coredump] Storage=none ```
3. 按如下方式配置
/etc/security/limits.conf
:``` * hard core 0 ```
4. 使用
ulimit
指令:ulimit -c 0
使用
gdb
对已有进程生成core dump file
的方式为:gdb -p <pid>
启动对进程的调试,其中<pid>
为进程的进程ID- 在
gdb
中使用指令generate-core-file
生成core dump file
参考资料:
-
如何使用GDB进行远程调试?
参考答案使用GDB进行远程调试通常需要以下步骤:
- 准备目标设备和调试主机:
- 确保目标设备和调试主机在同一网络中,并可以相互通信。
- 在目标设备上安装并运行GDB服务器软件,例如OpenOCD、J-Link GDB Server等。
- 在调试主机上安装GDB调试器。
- 启动GDB服务器:
- 在目标设备上运行GDB服务器,配置它以监听特定的端口,例如TCP端口。
- 连接到目标设备:
- 在调试主机上打开终端或命令行界面,启动GDB调试器。
- 使用GDB的"target remote"命令连接到目标设备的IP地址和端口,例如:
target remote <target_ip_address>:<port>
。
- 加载和调试程序:
- 使用GDB的"file"命令加载目标设备上的可执行文件,例如:
file <executable_file>
。 - 设置断点、单步执行或其他调试操作,以控制程序的执行。
- 使用GDB的其他命令进行调试,例如查看变量、回溯函数调用等。
- 使用GDB的"file"命令加载目标设备上的可执行文件,例如:
需要注意的是,远程调试的具体步骤可能因目标设备和调试工具的不同而有所差异。建议参考相关的GDB调试器和GDB服务器的文档,以了解更详细的配置和使用说明。
参考资料:
- 准备目标设备和调试主机: