gdb常用定位命令及基本问题定位方法

1 gdb常用调试命令及技巧

1、gdb中如何定义临时变量

(gdb) set $i="hello"
(gdb) ptype $i
typee = char[6]
gdb定义结构体变量:call malloc 构造结构体变量,然后填定内容,然后即可当成参数进行传值;
(gdb) call malloc(sizeof(VFP_QUE_HI161X_PHY_CB)
$1=0xfbbdf0
(gdb) set ((VFP_QUE_HI161X_PHYS_CB*)0xfbbdf0)->uiPhysQueId
$3 = 10

2、强制函数返回

如果你的调试断点在某个函数中,并还有语句没有执行完。你可以使用return命令强制函数忽略还没有执行的语句并返回。
return
return <expression>
使用return 命令取消当前函数的执行,并立即返回,如果指定了<expression>,那么表达式的值会被认作函数的返回值。
set print pretty on 可以显示的结构体更直观;

3、显示的调用某函数并打印返回值

call和print以强制调用函数;
call如果返回void不显示,
print的则显示函数返回值;

4、线程操作

#锁定当前运行线程
set scheduler-locking on
#attach到特定的thread,切换到特定线程
thread thread_num 
#在线程上打断点
break [function] thread [num]

5、设置单步行行模式

set step-mode on 

6、watch的使用

单线程增加watch点
watch g_pstMemCB thread 2
所有线程增加watch点
thread apply all watch g_pCfgVfpDiagNse

7动态读入dbg文件

info sharedlibarary(去掉原来的dbg,要不然会产生双重断点)
(gdb) add-symbol-file /opt/V800R9C00SPC100/vrpv8/module/libvfpboard_npu240.dbg 0xe64d390
add symbol-file /opt/V800R009C00SPC100/vrpv8/module/libvfpboard_npu240b.dbg -readnow

7告诉gdb 源码位置

(gdb) directory /home/manu/code/c/classical/eglibc-2.15/nptl

设置捕捉点(CatchPoint)

可设置捕捉点来补捉程序运行时的一些事件。如载入共享库(动态链接库)或是C++的异常。设置捕捉点的格式为:
catch <event>
当event发生时,停住程序。event可以是下面的内容:
●throw  一个C++抛出的异常 (throw为关键字)。
●catch  一个C++捕捉到的异常 (catch为关键字)。
●exec  调用系统调用exec时(exec为关键字,目前此功能只在HP-UX下有用)。
●fork  调用系统调用fork时(fork为关键字,目前此功能只在HP-UX下有用)。
●vfork  调用系统调用vfork时(vfork为关键字,目前此功能只在HP-UX下有)。
●load 或 load <libname>  载入共享库(动态链接库)时 (load为关键字,目前此功能只在HP-UX下有用)。
●unload 或 unload <libname>  卸载共享库(动态链接库)时 (unload为关键字,目前此功能只在HP-UX下有用)。
tcatch <event>
只设置一次捕捉点,当程序停住以后,应点被自动删除。

多进程程序调试相关(fork/vfork)

(1)缺省方式:fork/vfork之后,GDB仍然调试父进程,与子进程不相关
(2)set follow-fork-mode mode:设置GDB行为,mode为parent时,与缺省情况一样;mode为child时,fork/vfork之后,GDB进入子进程调试,与父进程不再相关
(3)show follow-fork-mode:查看当前GDB多进程跟踪模式的设置

8、查看内存地址

扫描二维码关注公众号,回复: 1460028 查看本文章
x /nfu 0x<addr>
n表示要显示的内存单元的个数
f表示显示方式, 可取如下值
  x 按十六进制格式显示变量。
  d 按十进制格式显示变量。
  u 按十进制格式显示无符号整型。
  按八进制格式显示变量。
  t 按二进制格式显示变量。
  a 按十六进制格式显示变量。
  i 指令地址格式
  c 按字符格式显示变量。
  f 按浮点数格式显示变量。
u表示一个地址单元的长度
  b表示单字节,
  h表示双字节,
  w表示四字节,
  g表示八字节

9、进看详细的调用栈:

bt full

10、gdb宏定义及使用

define find
set $ptr = $arg0
set $cnt = 0
while ( ($ptr<=$arg1) && ($cnt<$arg3) )
  if ( *(unsigned long *)$ptr == $arg2 )
      x/gx $ptr
      set $cnt = $cnt + 1
  end
  set $ptr = $ptr + 8
end
end
----------
(gdb) p $rsp
$2 = (void *) 0x7fffffffe4d0
(gdb) find 0x7fffffffe000 0x7fffffffe4d0 0x7fffffffe4c0 3
0x7fffffffe370: 0x00007fffffffe4c0
0x7fffffffe450: 0x00007fffffffe4c0
(gdb) x/2gx 0x7fffffffe370
0x7fffffffe370: 0x00007fffffffe4c0      0x00007ffff72fba2a
(gdb) x/2gx 0x7fffffffe450
0x7fffffffe450: 0x00007fffffffe4c0      0x000000000040066c

11、gdb增加书签,可返复回退

https://www.ibm.com/developerworks/cn/linux/l-cn-gdbtab/ 

12、生成core的3种方法:

1、不终止程序生成core
$gcore 1920  //进程号为、1920
$gcore `pidof ./a.out` //进程名为./a.out
2、gdb调试时不中断调试生成当前进程的core
(gdb)gcore
saved corefile core.3194 //3194就是当前进程的进程号PID
3、奔溃时自已产生;

13、显示异常和当前文件

info catch 显示异常处理函数;
info files 列出当前的文件

14、寄存器信息解读

r b p rip 指令寄存器,指向当前执行的代码位置
r s p rax, r b x , rcx, r d x , rsi, r d i , rbp, r 8 , r9, r 10 , r11, r 12 , r13, r 14 , r15
为通用寄存器用来存放输入参数,寄存器不够时,压到栈上
r a x rdi、 r s i rdx、 r c x r8、 r 9 g d b p / d rdi)。
通常函数的起始操作为push r b p 8 B y t e s s u b x x x , rsp,为当前函数内所有在栈上的局部变量都申请好需要的栈空间

15、dmesg信处分析

servicefx_afr_2[13389]: segfault at a1000000ca ip 0000003b2c69d54d sp 00007fc968d7a3f0 error 6 in libstdc++.so.6.0.13[3b2c600000+e8000]
servicefx_afr_2[14792]: segfault at a1000000ca ip 0000003b2c69d54d sp 00007fc0b8ed1330 error 6 in libstdc++.so.6.0.13[3b2c600000+e8000]
servicefx_afr_2[14984]: segfault at 18 ip 00000038ac876223 sp 00007f8a13ffe080 error 4 in libc-2.12.so[38ac800000+18a000]
servicefx_afr_2[16596]: segfault at 7d000000f2 ip 0000003b2c69d54d sp 00007f201fffe3f0 error 6 in libstdc++.so.6.0.13[3b2c600000+e8000]
servicefx_afr_2[16864]: segfault at a1000000ca ip 0000003b2c69d54d sp 00007f01d3ffe3f0 error 6 in libstdc++.so.6.0.13[3b2c600000+e8000]
jTTSService4.ex[15987]: segfault at 7f8d16ec9000 ip 00000038ac8844ed sp 00007f8d169e8a58 error 7 in libc-2.12.so[38ac800000+18a000]
jTTSService4.ex[16663]: segfault at 7fe41fabd000 ip 00000038ac8844ed sp 00007fe41f5dca58 error 7 in libc-2.12.so[38ac800000+18a000]
jTTSService4.ex[20119]: segfault at 7f4788e61000 ip 00000038ac8844ed sp 00007f478897da48 error 7 in libc-2.12.so[38ac800000+18a000]
jTTSService4.ex[21282]: segfault at 7fce9f3f4000 ip 00000038ac8844ed sp 00007fce9ef10a58 error 7 in libc-2.12.so[38ac800000+18a000]
jTTSService4.ex[21567]: segfault at 7f83715f8000 ip 00000038ac8844ed sp 00007f8380498a38 error 7 in libc-2.12.so[38ac800000+18a000]
error 7 in libc-2.12.so[38ac800000+18a000] 38ac800000 so装入地址,18a000长度;
用ip寄存器地址减去装入地址即可 :00007f9ebc0054c8 - 7f9ebbe40000 = 1C54C8
在文件汇编中( objdump -d /tmp/xxxxx.so),找到相应的汇编代码行,
$ addr2line -e /tmp/appstore-mid.so 1c54c8 汇编中的函数名 (通过该指令得到具体行)

16、反汇编定位

gcc    -g   -o   main   main.c  //编译出可执行镜象
objdump   -d  main   >   main.dump   //通过镜象返汇编
gcc   -Wall   -S  -o   main.s   main.c  
(gdb) disassemble  //运行时当前函数反汇编
//返汇编可以查看到函数中的寄存器使用情况,info reg后,查看相应的值;

17、栈溢出定位

Stack frame at xxxx的意义为当前帧的用户栈起始地址
frame 0的当前栈使用为:0x7fffffffe1d0 - 0x7fffffffe1c0 = 16 Bytes
frame 1的当前栈使用为:0x7fffffffe220 - 0x7fffffffe1d0 = 80 Bytes
当前栈使用为:0x7fffffffe580 - 0x7fffffffe1c0
通过计算出的大小,去判断栈是否溢出,确定在哪一帧导至溢出。

18 、列锁定位方法

gdb
attach pid
thread applay all bt
通过打印出 pthread_mutex_t 查看所信息
{__data = {__lock = 2, _count = 0, __owner = 20644, __kind = 0, __nusers = 1, {_spins = 0, __list = { 
__next = 0x0}}}, 
__size =\002\000\000\000\000\000\000\000\244P\000\000\000\000\000\000\001\000\000\000\000\000\000”, __align = 2} 
pthread_mutex_t 通过寄存器获取;
(gdb) thread apply all bt

Thread 3 (Thread 0x7ffff692b700 (LWP 28269)):
#0  0x00007ffff7708294 in __lll_lock_wait () from /lib64/libpthread.so.0
#1  0x00007ffff7703619 in _L_lock_1008 () from /lib64/libpthread.so.0
#2  0x00007ffff770342e in pthread_mutex_lock () from /lib64/libpthread.so.0
#3  0x0000000000400963 in thread2 (arg=0x7fffffffe180) at deadlock.c:44
#4  0x00007ffff77017b6 in start_thread () from /lib64/libpthread.so.0
#5  0x00007ffff745cd6d in clone () from /lib64/libc.so.6
#6  0x0000000000000000 in ?? ()

Thread 2 (Thread 0x7ffff712c700 (LWP 28268)):
#0  0x00007ffff7708294 in __lll_lock_wait () from /lib64/libpthread.so.0
#1  0x00007ffff7703619 in _L_lock_1008 () from /lib64/libpthread.so.0
#2  0x00007ffff770342e in pthread_mutex_lock () from /lib64/libpthread.so.0
#3  0x0000000000400843 in print (buf=0x7fffffffe180 "abcdefg") at deadlock.c:9
#4  0x00000000004008d9 in thread1 (arg=0x7fffffffe180) at deadlock.c:28
#5  0x00007ffff77017b6 in start_thread () from /lib64/libpthread.so.0
#6  0x00007ffff745cd6d in clone () from /lib64/libc.so.6
#7  0x0000000000000000 in ?? ()

Thread 1 (Thread 0x7ffff7fcb700 (LWP 28264)):
#0  0x00007ffff7701f95 in pthread_join () from /lib64/libpthread.so.0
#1  0x0000000000400a41 in main () at deadlock.c:64
(gdb) thread 3

猜你喜欢

转载自blog.csdn.net/dodonei/article/details/78006313