gdb调试器入门教程

一、启动调试程序

1, 调试一个正在运行中的程序
gdb attach [pid]
2, 启动gdb时同时加载待调试程序
gdb //先运行gdb
file ./a.out //加载待调试程序
r //运行
3, 先启动gdb,再加载、运行待调试程序
gdb ./a.out


二、gdb开启源码界面、界面布局设置

1, 可以在gdb命令行界面中显示源码,使用tui enable命令
(gdb) tui endable
2, 设置指定窗口大小
(gdb) winheight src 30
如上,设置源码窗口在屏幕上占用30行。
3, 界面布局设置只显示源代码
(gdb) layout src
4, 界面布局设置只显示汇编代码
(gdb) layout asm
5, 界面布局设置增加寄存器显示
(gdb) layout regs
6, 显示下一个寄存器组
(gdb) tui reg next
7, 设置当前操作哪个窗口
(gdb) focus cmd/asm/src/regs
例如:focus src执行之后,我们再按下上下左右键就会在源码窗口移动光标了。


三、程序运行控制

r 从头开始重新运行
c 继续往下运行,直到再次执行到断点。
until 用于在循环中使用,继续往下运行,直到跳出循环。
n 单步调试,但不进入函数内部(一整个函数调用算一步)
s 单步调试,进入函数内部执行


四、程序信息获取(变量、变量类型、符号名称和地址等)

1、p 打印变量或表达式的值以及变量地址
示例:打印0结构体,tid成员的内存地址
(gdb) p &((struct pthread *)0)->tid

info 打印
info line: 查看某一行的内存地址,可用来查看函数地址
info address:
  1, 可用来查看某个地址上的符号,用来查看某个地址对应的函数。s
  2, 可用来查看某个符号对应的地址。

2、查看函数返回值:
print 函数调用语句

3、ptype 获取变量或结构体的定义

示例:

(gdb) ptype struct pthread
type = struct pthread {
    union {
        tcbhead_t header;
        void *__padding[24];
    };
    list_t list;
    pid_t tid;
    pid_t pid;
    void *robust_prev;
    struct robust_list_head robust_head;
    struct _pthread_cleanup_buffer *cleanup;
    struct pthread_unwind_buf *cleanup_jmp_buf;
    int cancelhandling;
    int flags;
    struct pthread_key_data specific_1stblock[32];
    struct pthread_key_data *specific[32];
    _Bool specific_used;
    _Bool report_events;
    _Bool user_stack;
    _Bool stopped_start;
    int parent_cancelhandling;
    int lock;
    unsigned int setxid_futex;
    hp_timing_t cpuclock_offset;
    struct pthread *joinid;
    void *result;
    struct sched_param schedparam;
    int schedpolicy;
    void *(*start_routine)(void *);
    void *arg;
    td_eventbuf_t eventbuf;
    struct pthread *nextevent;
    struct _Unwind_Exception exc;
    void *stackblock;
    size_t stackblock_size;
    size_t guardsize;
    size_t reported_guardsize;
    struct priority_protection_data *tpp;
    struct __res_state res;
---Type <return> to continue, or q <return> to quit---
    char end_padding[];
}

五、设置断点、状态监控点

1, 设置断点

b [line]
在文件的某一行设置断点,默认为当前正在查看的文件。
b [file]:[line]
在指定文件file的某一行设置断点
例:

(gdb) b tds_ulck_Gdata_test.cpp:232
Breakpoint 1 at 0x17da: file tds_ulck_Gdata_test.cpp, line 232.
(gdb) info b
Num     Type           Disp Enb Address            What
1       breakpoint     keep y   0x00000000000017da in readMsg(MsgItem const&) 
                                                   at tds_ulck_Gdata_test.cpp:232

2, 设置条件断点

其实就是在设置断点的基础上加入一个if语句,也可以把gdb的变量加入判断
b [bnum] if [condition]
b [file]:[bnum] if [condition]
例:

可以通过condition命令来修改条件(不需要加if了)
condition
取消条件
condition

3, 变量监控点

watch var
在变量var处设置一个写观察点(也属于断点,可以用info b查看),当该变量被写入时,由GDB暂停程序。
rwatch var
在变量var处设置一个读观察点(也属于断点,可以用info b查看),当该变量被读取时,由GDB暂停程序。
awatch var
在变量var处设置一个读写观察点(也属于断点,可以用info b查看),当该变量被读取或写入时,由GDB暂停程序。

4、为断点编写处理程序

通过断点编号设置
commands [bnum]
func
continue //continue使得执行完处理函数后继续执行,当然可以不加,会停在这里
end

示例:
如下16行,执行了我们编写的处理函数

(gdb) command 1
Type commands for breakpoint(s) 1, one per line.
End with a line saying just "end".
>printf "iWrite:%d\n", iWrite
>end
(gdb) r 1
Starting program: /home/am/loongson_works/dproblem/T30929-716S-sharemem_sync/716S-concurrent/tds_ulck_Gdata_test 1
[Thread debugging using libthread_db enabled]
Using host libthread_db library "/lib/x86_64-linux-gnu/libthread_db.so.1".
[New Thread 0x7ffff6e83700 (LWP 16872)]
[New Thread 0x7ffff6682700 (LWP 16873)]
[Switching to Thread 0x7ffff6e83700 (LWP 16872)]

Thread 2 "tds_ulck_Gdata_" hit Breakpoint 1, readMsg (item=...) at tds_ulck_Gdata_test.cpp:232
232	        cerr << "item.outer_sub : " << item.outer_sub << endl  << "yinggai shuju :  " << ((iRead + startData - 1) % 47 + 1) << endl;
iWrite:0
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值