GDB使用总结
1 core-dump问题
1 设置core文件大小
ulimit -c unlimited
2 修改core文件保存位置
sudo sysctl -w kernel.core_pattern=/tmp/core-%e.%p.%h.%t
通过下面命令查看core保存位置:
sysctl kernel.core_pattern
3 运行程序,用gdb执行产生的core文件`
gdb -c /tmp/core-vdpauinfo.103058.sw-server.1686296439
如果打出的信息中没有符号信息,文件名等信息都是问号(??),则用以下方法:
gdb bin文件 //如 gdb a.out
//在gdb内部执行以下命令
core-file core文件 //如core-file /tmp/core-vdpauinfo.103058.sw-server.1686296439
//再执行bt或者where,即可显示函数、行号等信息
bt
2 打印问题
2.1 打印内存的值
x命令可以打印内存的值,格式如下:
x/nfu addr
#作用:以f指定的格式,从地址addr处拿出n个值打印,值的字节数由u指定
n:输出单元的个数
f:指定格式,x表示十六进制,u表示十进制,o表示八进制,t表示二进制
u:表明一个单元的长度,b是一个字节,h是两个字节(halfbyte),w是四个字节(word),
如:
(gdb) x/32xb buf
0x555557843f00: 0x00 0x00 0x3d 0x9b 0x65 0x88 0x84 0x17
0x555557843f08: 0xc9 0x80 0x5b 0xd8 0x00 0x09 0x40 0x8d
0x555557843f10: 0xf4 0xbf 0xe9 0x5f 0xc1 0x3e 0xfb 0xf2
0x555557843f18: 0x61 0x1a 0x25 0xfc 0x7f 0xa7 0x09 0x12
(gdb) x/32ub buf
0x555557843f00: 0 0 61 155 101 136 132 23
0x555557843f08: 201 128 91 216 0 9 64 141
0x555557843f10: 244 191 233 95 193 62 251 242
0x555557843f18: 97 26 37 252 127 167 9 18
(gdb) x/32tb buf
0x555557843f00: 00000000 00000000 00111101 10011011 01100101 10001000 10000100 00010111
0x555557843f08: 11001001 10000000 01011011 11011000 00000000 00001001 01000000 10001101
0x555557843f10: 11110100 10111111 11101001 01011111 11000001 00111110 11111011 11110010
0x555557843f18: 01100001 00011010 00100101 11111100 01111111 10100111 00001001 00010010
3 扩展宏
1 在编译时加上-g3选项
2 在gdb调试中使用命令macro expand 宏名
如:
macro expand UPDATE_CACHE(re, s)
expands to: re_cache = av_bswap32((((const union unaligned_32 *) ((s)->buffer + (re_index >> 3)))->l)) << (re_index & 7)