一些常见的GDB 调试命令汇总
1、查看栈帧信息
i frame 帧标号
2、查看所以线程信息
thread apply all bt
或者:t a a bt
再调试某线程:t 线程号
3、查看内存
x/40x 地址
例如先获取数组地址,再打印内容
p/x arrry
x/40xg arrry_addr /* 8字节显示 /
x/40xw arrry_addr / 4字节显示 */
命令语法: x /Nuf experssion
- N – 需要打印的单元数
- u – 每个单元的大小
u对应的意义:
b 单字节
h 双字节
w 4字节
g 8字节
f – 数据打印的格式
x 16进制
u 无符号十进制
i 指令地址格式
4、查看变量值
有时候,你需要查看一段连续的内存空间的值。比如数组的一段,
或是动态分配的数据的大小。你可以使用GDB的“@”操作符,“@”的左边是
第一个内存的地址的值,“@”的右边则你你想查看内存的长度
(gdb) p/x *pkt_user@1
$5 = {ctrl_head_is_set = 0x0, payload_head_is_set = 0x0, payload_is_set = 0x0, tx_performance_open = 0x0, rx_pkts_display = 0x0,
tx_pkts_display = 0x0, rx_pd_head_display = 0x0, tx_pd_head_display = 0x0, rx_ctrl_head_display = 0x0, tx_ctrl_head_display = 0x0,
tx_busy = 0x0, payload_head_len = 0x0, payload_len = 0x0, packet_len = 0x0, rx_pkts_display_len = 0x0, tx_pkts_display_len = 0x0,
pkt_num_to_send = 0xffffffff, pkt_rxtx_mode = 0x3, payload_list = 0x6808b8, pkt_ctrl_head = {eop_flag = 0x0, sop_flag = 0x0,
head_parity = 0x0}, loop_pkt = {loop_mode = 0x0, strip_len = 0x0, head_pos = 0x0, head_len = 0x0, valid_head_len = 0x0, head = {0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0}}}
(gdb)
5、查看当前堆栈信息:
i frame 或者 info frame
6、查看pc寄存器地址处的代码
查看出问题时的 pc指针(rip)指向的地址 如: rip = 0x8048484
再查看该地址处的代码: x/5i $rip