2021-09-01

gdb调试

gdb调试命令*********************************************

gdb 启动进程无参数的程序
gdb ./test
Running Programs Under gdb
(gdb) file test
(gdb) r
(gdb) l

gdb 启动进程带参数的程序
[root@(none) ~]# ./main a b c
[root@(none) ~]# gdb main
(gdb) set args a b c
(gdb) r

gdb --args ./main  10000 0 1

关联进程
Debugging an Already-running Process
(gdb) file test
(gdb) attach pid

线程
(gdb) info thread
(gdb) thread thread_num

断点
(gdb) b *0x0804ce2b
(gdb) b main
(gdb) b fun thread 1
(gdb) b thread.c:26 if 1000==j
(gdb) break frik.c:13 thread 28 if bartab > lim
break thread
break thread if …
linespec 源程序的行号,threadno 指定了线程的 ID;b=break

数据断点
(gdb) watch *(int *)0x8049aa4
0x8049aa4 处下写断点,断点的范围为 4个字节,rwatch ,awatch 用法同 watch ,分别表示读断点和 读写断点。

删除断点
(gdb) delete 2-8

单步:
(gdb) n (step over)
(gdb) s (step in)
(gdb) ni (next instruction)
(gdb) si (step instruction )
(gdb) finish
(gdb) n [count] //单步n条;
(gdb) until
(gdb) until line-number

中断命令:
interrupt

继续执行
(gdb)c
(gdb)c -a //恢复所有线程
(gdb)c -a&
(gdb)c&
(gdb)c 40 &
Will ignore next 39 crossings of breakpoint 40. Continuing.
(gdb)run r/run //运行程序
(gdb) finish //执行到返回

汇编
(gdb) disas p c , pc, pc,pc+30
(gdb) disassemble /rm
(gdb) x/5i $pc
disassemble 反汇编一段指令。可以带零个、一个或两个参数。第一个参数是反汇编开始地址,第二个参数是反汇编结束地址。
disassemble命令的/m指示显示汇编指令的同时,显示相应的程序源码;/r指示显示十六进制的计算机指令(raw instruction)。

寄存器
(gdb) i r
(gdb) display /x $pc
(gdb) p $pc

修改寄存器的值	
(gdb) set $v0 = 0x004000000
(gdb) set $epc = 0xbfc00000

内存
(gdb) x/32w 0x7fffffffe378
(gdb) x/8x $rsp

(gdb) x/32xb $rbp
(gdb) x/32xh $rbp
(gdb) x/32xw $rbp
(gdb) x/32xg $rbp

修改内存的值
(gdb) set {unsigned int}0x8048a51=0x0
(gdb) set *(unsigned int*)0x8048a54=0x55aa55aa
	  set {unsigned long}0x7fffffffc060=0x000000f480b70f44

堆栈相关命令
命令格式 例子 作用
backtrace/bt bt 用来打印栈帧指针
frame frame 1 调用链中切换frame
info reg info reg 查看寄存器使用情况
info stack info stack 查看堆栈使用情况
up/down up/down 跳到上一层/下一层函数

参数
(gdb) info args

局部变量
(gdb) info locals
(gdb) p    <expr>
(gdb) p/x  <expr>
(gdb) p *array@len
(gdb) p ptCachePoolCtl->pdwHAddrLink @ 100
(gdb) p ((T_Ctrl*)0)->dwSize
(gdb) p *((T_CachePoolCtl*)0x7f6768c3c590)
(gdb) p/x $rbx+0x20
(gdb) p/x *($rbx+0x20)
(gdb) p *((T_Ctrl*)$rbx)

(gdb) set ptCachePoolCtl=0x1

变量类型
(gdb) ptype i
type = unsigned int

设置gdb non-stop模式
./gdb
set schedule-multiple off
set pagination off
set non-stop on
set target-async on
set solib-search-path /share/src/Output
set substitute-path /home/ext2 /cygdrive/src
file /share/code/Output/test_tmp
target remote 192.168.1.16:7788

gdb多线程调试**************************
默认当你的程序被 GDB 停住时,所有的运行线程都会被停住。这方便你你查看运行程序的总体情况。而在你恢复程序运行时,
所有的线程也会被恢复运行。那怕是主进程在被单步调试时。相反 set non-stop on 只停止指定的线程。

https://blog.csdn.net/sinat_36118270/article/details/73441038  多线程调试

set scheduler-locking off
set pagination off                                                                              
set non-stop on  
set target-async on	

set schedule-multiple on|off

show schedule-multiple:这个选项类似于多线程调试里的set scheduler-locking选项,当选项是off(默认值)的时候,GDB发出执行指令的时候,只有当前inferior会执行。而当选项是on的时候,GDB发出执行命令后,全部状态是执行状态的inferior都会执行。注意,如果scheduler-locking选项设置为lock的时候,即使schedule-multiple设置为on,也只有当前进程的当前线程会执行。

thread apply all command:所有线程都执行command命令。
set scheduler-locking off|on|step:
在调式某一个线程时,其他线程是否执行。off,不锁定任何线程,默认值。on,锁定其他线程,只有当前线程执行。step,在step(单步)时,只有被调试线程运行。

set non-stop on/off:当调式一个线程时,其他线程是否运行。
  set pagination on/off:在使用backtrace时,在分页时是否停止。
  set target-async on/ff:同步和异步。同步,gdb在输出提示符之前等待程序报告一些线程已经终止的信息。而异步的则是直接返回。

指定源文件的路径 
(gdb) directory ./fPIC/
Source directories searched: /home/ext2/src/gdb/build_x86_gdb/gdb/./fPIC:$cdir:$cwd
(gdb) cd ./fPIC/
Working directory /home/ext2/src/gdb/build_x86_gdb/gdb/fPIC.

For example, if the file ‘/foo/bar/baz.c’ was moved to ‘/mnt/cross/baz.c’,then the command
(gdb) set substitute-path /foo/bar /mnt/cross



设置动态库路径:
(gdb) set solib-absolute-prefix /home/work/root/lib/  
(gdb) set solib-search-path    /home/work/root/lib/ 


info inferiors:查询正在调试的进程

inferior :切换调试的进程
  clone-inferior [ -copies n ] [ infno ]:增加n个inferior并且其执行程序指定为和infno号inferior一样

********************************************gdbserver调试 ****************************************************************************
gdbserver:
./mnt/test/gdbserver :7788 test
./mnt/test/gdbserver :7788 --attach 3745

gdb:
set schedule-multiple off
set pagination off
set non-stop on
set target-async on
set solib-search-path ./
set substitute-path /share /cygdrive/x //设置代码路径;编译路径:/share/src/test 调试机上路径:/cygdrive/x/src/test
file /share/Output/test_tmp //带调试信息
target remote 192.168.1.16:7788

(gdb) b TestCache
Note: breakpoints 1 and 2 also set at pc 0x15ad630.
Breakpoint 3 at 0x15ad630: file /share/src/test.c, line 30.
(gdb)


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值