# 显示寄存器窗口
## 例子
#include <stdio.h>
void fun1(void)
{
int i = 0;
i++;
i = i * 2;
printf("%d\n", i);
}
void fun2(void)
{
int j = 0;
fun1();
j++;
j = j * 2;
printf("%d\n", j);
}
int main(void)
{
fun2();
return 0;
}
## 技巧
使用gdb图形化调试界面时,可以使用“`layout regs`”命令显示寄存器窗口。以调试上面程序为例:
┌──Register group: general─────────────────────────────────────────────────────────────────────────┐
│rax 0x34e4590f60 227169341280 rbx 0x0 0 │
│rcx 0x0 0 rdx 0x7fffffffe4b8 140737488348344 │
│rsi 0x7fffffffe4a8 140737488348328 rdi 0x1 1 │
│rbp 0x7fffffffe3c0 0x7fffffffe3c0 rsp 0x7fffffffe3c0 0x7fffffffe3c0 │
│r8 0x34e458f300 227169334016 r9 0x34e3a0e9f0 227157273072 │
│r10 0x7fffffffe210 140737488347664 r11 0x34e421ec20 227165727776 │
│r12 0x4003e0 4195296 r13 0x7fffffffe4a0 140737488348320 │
└──────────────────────────────────────────────────────────────────────────────────────────────────┘
│17 j++; │
│18 j = j * 2; │
│19 printf("%d\n", j); │
│20 } │
│21 │
│22 int main(void) │
│23 { │
>│24 fun2(); │
└───────────────────────────────────────────────────────────────────────────────────────────────┘
native process 12552 In: main Line: 24 PC: 0x40052b
Reading symbols from a...done.
(gdb) start
Temporary breakpoint 1 at 0x40052b: file a.c, line 24.
Starting program: /home/nan/a
Temporary breakpoint 1, main () at a.c:24
(gdb)
可以看到,显示了通用寄存器的内容。
如果想查看浮点寄存器,可以使用“`tui reg float`”命令:
┌──Register group: float───────────────────────────────────────────────────────────────────────────┐
│st0 0 (raw 0x00000000000000000000) │
│st1 0 (raw 0x00000000000000000000) │
│st2 0 (raw 0x00000000000000000000) │
│st3 0 (raw 0x00000000000000000000) │
│st4 0 (raw 0x00000000000000000000) │
│st5 0 (raw 0x00000000000000000000) │
│st6 0 (raw 0x00000000000000000000) │
└──────────────────────────────────────────────────────────────────────────────────────────────────┘
│16 fun1(); │
│17 j++; │
│18 j = j * 2; │
│19 printf("%d\n", j); │
│20 } │
│21 │
│22 int main(void) │
│23 { │
└───────────────────────────────────────────────────────────────────────────────────────────────┘
native process 12552 In: main Line: 24 PC: 0x40052b
Temporary breakpoint 1 at 0x40052b: file a.c, line 24.
Starting program: /home/nan/a
Temporary breakpoint 1, main () at a.c:24
(gdb) tui reg float
“`tui reg system`”命令显示系统寄存器:
┌──Register group: system──────────────────────────────────────────────────────────────────────────┐
│orig_rax 0xffffffffffffffff -1 │
│ │
│ │
│ │
│ │
│ │
│ │
└──────────────────────────────────────────────────────────────────────────────────────────────────┘
│16 fun1(); │
│17 j++; │
│18 j = j * 2; │
│19 printf("%d\n", j); │
│20 } │
│21 │
│22 int main(void) │
│23 { │
└───────────────────────────────────────────────────────────────────────────────────────────────┘
native process 12552 In: main Line: 24 PC: 0x40052b
Temporary breakpoint 1, main () at a.c:24
(gdb) tui reg system
(gdb)
想切换回显示通用寄存器内容,可以使用“`tui reg general`”命令:
┌──Register group: general─────────────────────────────────────────────────────────────────────────┐
│rax 0x34e4590f60 227169341280 rbx 0x0 0 │
│rcx 0x0 0 rdx 0x7fffffffe4b8 140737488348344 │
│rsi 0x7fffffffe4a8 140737488348328 rdi 0x1 1 │
│rbp 0x7fffffffe3c0 0x7fffffffe3c0 rsp 0x7fffffffe3c0 0x7fffffffe3c0 │
│r8 0x34e458f300 227169334016 r9 0x34e3a0e9f0 227157273072 │
│r10 0x7fffffffe210 140737488347664 r11 0x34e421ec20 227165727776 │
│r12 0x4003e0 4195296 r13 0x7fffffffe4a0 140737488348320 │
└──────────────────────────────────────────────────────────────────────────────────────────────────┘
│16 fun1(); │
│17 j++; │
│18 j = j * 2; │
│19 printf("%d\n", j); │
│20 } │
│21 │
│22 int main(void) │
│23 { │
└───────────────────────────────────────────────────────────────────────────────────────────────┘
native process 12552 In: main Line: 24 PC: 0x40052b
(gdb) tui reg general
(gdb)
参见[gdb手册](https://sourceware.org/gdb/onlinedocs/gdb/TUI-Commands.html).
## 贡献者
nanxiao
- 介绍
- 信息显示
- 显示gdb版本信息
- 显示gdb版权相关信息
- 启动时不显示提示信息
- 退出时不显示提示信息
- 输出信息多时不会暂停输出
- 函数
- 列出函数的名字
- 是否进入带调试信息的函数
- 进入不带调试信息的函数
- 退出正在调试的函数
- 直接执行函数
- 打印函数堆栈帧信息
- 打印尾调用堆栈帧信息
- 选择函数堆栈帧
- 向上或向下切换函数堆栈帧
- 断点
- 在匿名空间设置断点
- 在程序地址上打断点
- 在程序入口处打断点
- 在文件行号上打断点
- 保存已经设置的断点
- 设置临时断点
- 设置条件断点
- 忽略断点
- 观察点
- 设置观察点
- 设置观察点只针对特定线程生效
- 设置读观察点
- 设置读写观察点
- Catchpoint
- 让catchpoint只触发一次
- 为fork调用设置catchpoint
- 为vfork调用设置catchpoint
- 为exec调用设置catchpoint
- 为系统调用设置catchpoint
- 通过为ptrace调用设置catchpoint破解anti-debugging的程序
- 打印
- 打印ASCII和宽字符字符串
- 打印STL容器中的内容
- 打印大数组中的内容
- 打印数组中任意连续元素值
- 打印数组的索引下标
- 打印函数局部变量的值
- 打印进程内存信息
- 打印静态变量的值
- 打印变量的类型和所在文件
- 打印内存的值
- 打印源代码行
- 每行打印一个结构体成员
- 按照派生类型打印对象
- 指定程序的输入输出设备
- 使用“$\”和“$\_”变量
- 打印程序动态分配内存的信息
- 打印调用栈帧中变量的值
- 多进程/线程
- 调试已经运行的进程
- 调试子进程
- 同时调试父进程和子进程
- 查看线程信息
- 在Solaris上使用maintenance命令查看线程信息
- 不显示线程启动和退出信息
- 只允许一个线程运行
- 使用“$_thread”变量
- 一个gdb会话中同时调试多个程序
- 打印程序进程空间信息
- 使用“$_exitcode”变量
- core dump文件
- 为调试进程产生core dump文件
- 加载可执行程序和core dump文件
- 汇编
- 设置汇编指令格式
- 在函数的第一条汇编指令打断点
- 自动反汇编后面要执行的代码
- 将源程序和汇编指令映射起来
- 显示将要执行的汇编指令
- 打印寄存器的值
- 显示程序原始机器码
- 改变程序的执行
- 改变字符串的值
- 设置变量的值
- 修改PC寄存器的值
- 跳转到指定位置执行
- 使用断点命令改变程序的执行
- 修改被调试程序的二进制文件
- 信号
- 查看信号处理信息
- 信号发生时是否暂停程序
- 信号发生时是否打印信号信息
- 信号发生时是否把信号丢给程序处理
- 给程序发送信号
- 使用“$_siginfo”变量
- 共享库
- 显示共享链接库信息
- 脚本
- 配置gdb init文件
- 按何种方式解析脚本文件
- 保存历史命令
- 源文件
- 设置源文件查找路径
- 替换查找源文件的目录
- 图形化界面
- 进入和退出图形化调试界面
- 显示汇编代码窗口
- 显示寄存器窗口
- 调整窗口大小
- 其它
- 命令行选项的格式
- 支持预处理器宏信息
- 使用命令的缩写形式
- 在gdb中执行shell命令和make
- 在gdb中执行cd和pwd命令
- 设置命令提示符
- 设置被调试程序的参数
- 设置被调试程序的环境变量
- 得到命令的帮助信息
- 记录执行gdb的过程