gdb日常调试
编译
gcc -g3 -O0 -o my_program my_program.c
1、启动程序
gdb <proname>
2、设置断点
2.1 指定函数处
break <function_name>
2.2 指定文件和行数
break <filename>:<line_number>
3、运行程序
args:程序所带参数,可以不带
run <args>
3.1 单步运行
n
3.2 继续执行
c
4 查看堆栈信息
bt :可以看到调用函数层级关系
bt full :在bt的基础上,可以看到过程中每个函数的参数是什么
5 打印变量
打印一个局部变量的值 (gdb) print variable_name
打印一个全局变量的值 (gdb) print global_variable
打印指针变量所指向的值 (gdb) print *pointer_variable
打印数组的前n个元素值 (gdb) print array_name@n
打印结构体变量的成员值 (gdb) print struct_variable.member_name
打印特定寄存器的值 (gdb) info registers # 查看所有寄存器
(gdb) print $register_name
打印0x1234地址后6个字节 x/6xb 0x1234
6 调试coredump文件
6.1 设置coredump文件大小
#coredump 文件大小不设限制
ulimit -c unlimited
6.2 查看、设置coredump文件路径
#查看coredump文件路径
cat /proc/sys/kernel/core_pattern
#设置coredump文件路径
echo "/tmp/core.%e.%p" | sudo tee /proc/sys/kernel/core_pattern
6.3 调试coredump文件
sudo gdb /opt/seanet/SEABizApp/bin/gateway_platform core-gateway-platfor-39332-1713342088
7 disassemble反汇编
7.1 查看汇编指令
(gdb) disassemble #反汇编当前函数
(gdb) disassemble function_name #反汇编指定函数
(gdb) disassemble 0x08048340 0x0804836a #反汇编特定内存范围
(gdb) disassemble /m #反汇编当前指令附近的代码 将代码一行一行转化为汇编指令
7.2 实例演示
7.2.1 假如有以下函数
#include <stdio.h>
void foo() {
int a = 10;
int b = 20;
int c = a + b;
printf("c = %d\n", c);
}
int main() {
foo();
return 0;
}
7.2.2 反汇编main函数
- (gdb) disassemble main
Dump of assembler code for function main:
0x0000000000401149 <+0>: push %rbp
0x000000000040114a <+1>: mov %rsp,%rbp
0x000000000040114d <+4>: sub $0x10,%rsp
=> 0x0000000000401151 <+8>: callq 0x401130 <foo> // foo();
0x000000000040115d <+20>: mov $0x0,%eax
0x0000000000401162 <+25>: leave
0x0000000000401163 <+26>: ret
End of assembler dump.
- 结果详细解释
地址 指令操作码 操作数