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是程序的名称

%% A single % character
%p PID of dumped process
%u real UID of dumped process
%g real GID of dumped process
%s number of signal causing dump
%t time of dump (seconds since 0:00h, 1 Jan 1970)
%h hostname (same as ’nodename’ returned by uname(2))
%e executable filename
echo 1 > /proc/sys/kernel/core_uses_pid使得 core文件名后包含 .PID

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

 

posted on 2013-12-21 08:22  jacob1934  阅读(488)  评论(0)    收藏  举报

导航