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
使用return 命令取消当前函数的执行,并立即返回,如果指定了,那么表达式的值会被认作函数的返回值。
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 载入共享库(动态链接库)时 (load为关键字,目前此功能只在HP-UX下有用)。
●unload 或 unload 卸载共享库(动态链接库)时 (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、查看内存地址
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、寄存器信息解读
rbp当前栈地址 r b p 当 前 栈 地 址 rip 指令寄存器,指向当前执行的代码位置
rsp栈指针寄存器,指向当前栈顶 r s p 栈 指 针 寄 存 器 , 指 向 当 前 栈 顶 rax, rbx, r b x , rcx, rdx, r d x , rsi, rdi, r d i , rbp, r8, r 8 , r9, r10, r 10 , r11, r12, r 12 , r13, r14, r 14 , r15
为通用寄存器用来存放输入参数,寄存器不够时,压到栈上
rax保存函数返回值一般入参压栈的顺序: r a x 保 存 函 数 返 回 值 一 般 入 参 压 栈 的 顺 序 : rdi、 rsi、 r s i 、 rdx、 rcx、 r c x 、 r8、 r9程序中被优化的代码通过返汇编,分析汇编确定存放寄存器,gdb中直接打印(p/d r 9 程 序 中 被 优 化 的 代 码 通 过 返 汇 编 , 分 析 汇 编 确 定 存 放 寄 存 器 , g d b 中 直 接 打 印 ( p / d rdi)。
通常函数的起始操作为push rbp,将上帧的栈底地址8Bytes压入栈中在保存完指令地址和栈底地址后,会进行一次subxxx, 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