gdb笔记
【启动方式】
【一】直接用gdb启动程序。程序是./test,代码在./src中
$gdb ./test -d ./src
【二】将gdb附加到正在运行的程序上
$gdb ./test --pid=1122
或
$gdb
(gdb)attach 1122
#attach后程序是中断掉的,所以如果你的程序里面有看门狗之类的就要做些处理。
【三】使用gdb查看段错误时系统输出的core dump文件
在程序运行前需要设置系统能够输出core文件
$ulimit -c unlimited 这句是不限制coredump文件的大小,也可以限制文件的大小到一个数值,比如1024
$ulimit -a 显示coredump相关的设置
$echo "/tmp/core-%e" > /proc/sys/kernel/core_pattern 设置core文件的存放位置。%e是程序的名称
echo 0 > /proc/sys/kernel/core_uses_pid使得core文件名后不包含 .PID
$gdb ./test ./core
(gdb)bt
PS:test可以是debug版的,而输出core的程序是release版的,只要两者的代码、编译参数(除了-g选项)、环境都完全一样。所以,同时发布debug和release版的程序也是个办法
【.gdbinit】
不使用参数启动gdb时,gdb将在当前目录搜索.gdbinit文件,并执行其中的gdb命令。默认选项限制该文件的安全路径,可以传递安全路径参数:
gdb -iex "set auto-load safe-path /usr:/bin:~/src/gdb"
或者启动后设置:
set auto-load safe-path
或者直接在编译时加入选项,完全禁用autoload的安全路径
--without-auto-load-safe-path。
新的版本中也可以在~/.gdbinit中设置安全路径
【查看数组】
存在可访问指针int *pdata,查看pdata[0]开始的100个单位数据:
p pdata[0]@100
【线程】
(gdb)info threads 显示线程信息,包括该线程在该进程中的编号和在系统中的编号,以及当前阻塞的函数。
(gdb)thread 7 切换到该程序的第7个线程
【信号】
使用GDB调试过程中,默认收到信号会中断并打印,handle可以屏蔽信号的中断/打印,也可对被调试程序阻断该信号,示例:
handle SIGUSR2 noprint
【堆栈】
(gdb)bt
#0 0x40096720 in vfprintf () from /lib/libc.so.6
#1 0x4009f370 in printf () from /lib/libc.so.6
#2 0x0002910c in recv_socket_fifo (connect_id=0) at connect_manager.c:209
#3 0x00029368 in thread_recv () at connect_manager.c:250
#4 0x4002c640 in start_thread () from /lib/libpthread.so.0
#5 0x4011f148 in clone () from /lib/libc.so.6
#6 0x4011f148 in clone () from /lib/libc.so.6
Backtrace stopped: previous frame identical to this frame (corrupt stack?)(gdb) frame 2
#2 0x0002910c in recv_socket_fifo (connect_id=0) at connect_manager.c:209
209 printf("[%s]connect_id=%d closed by peer\n",__FUNCTION__,connect_id);
(gdb) info frame
Stack level 2, frame at 0x411a5d48:
pc = 0x2910c in recv_socket_fifo (connect_manager.c:209); saved pc 0x29368
called by frame at 0x411a5e28, caller of frame at 0x411a5d20
source language c.
Arglist at 0x411a5d44, args: connect_id=0
Locals at 0x411a5d44, Previous frame's sp is 0x411a5d48
Saved registers:
r11 at 0x411a5d40, lr at 0x411a5d44
(gdb) info locals
fd = 4
fifo_recv = 0x76008
len_free = 262113
buf = 0x40187027 ""
recv_len = 0
__FUNCTION__ = "recv_socket_fifo"
【寄存器】
info register
浙公网安备 33010602011771号