GDB 使用经验(二)

GDB 使用经验(二)
Hints of using GDB inside Emacs

继续前文GDB 使用经验, 这里介绍在Emacs中使用GDB的一点经验。

(1) GDB many windows mode 【1】

在M-x gdb 启动Emacs 中的GDB mode 之后,我们可以 M-x gdb-many-windows, 将GDB comand(GDB 命令)、local variable(局部变量)、source code(源程序代码)、stack(堆,用于检查函数调用的层数)、breakpoints(所有已经设置的断点)这5个有用的窗口排列起来。

如果想少打几个键,可以把下面的代码放到~/.emacs,这样以后M-x gmw 就等于是M-x gdb-many-windows了。

(defun gmw ()
"start gdb-many-windows"
(gdb-many-windows))

(2) 快捷键 Short cuts

在GDB中, 常用的命令包括continue, next等等。在Eamcs中的快捷键因窗口的不同而不同。例如,在GDB command窗口,next 的快捷键是C-x C-a C-n,而在source code窗口, next的快捷键是C-c C-n。但我们可以总结规律为基本命令都是prefix + key 的形式。

在GDB command 窗口的prefix 都是:C-c
在source code 窗口的prefix 都是:C-x C-a

key对应于next命令是: C-n
key对应于step命令是: C-s
key对应于until命令是: C-u
key对应于continue命令是: C-r
key对应于finish命令是: C-f
key对应于watch expression命令是: C-w (光标所在的变量会被watch,会出现另外一个窗口显示该变量)
key对应于print expression命令是: C-p (需要先mark一个region,这个region表示的expression表达式会被打印出来)
key对应于temporary breakpoint(临时断点)命令是: C-t
key对应于delete breakpoint(删除断点)命令是: C-d (如果当前行有断点,则删除之)

(3) Enable tools tips 【2】

在Visual Studio中另一个有用的功能是:当鼠标移动到一个变量上时,这个变量的值会通过tooltip的方式显示出来。
这个功能在GDB中也能实现。
在GUD菜单中选中”Show GUD tooltips”即可。使用效果如下:

【1】Fancy Debugging
【2】Tooltips

GDB 使用经验

本文介绍一些常用的GDB技巧

 

(1)使用.gdbinit

在.gdbinit里可以使用 define 命令,来简化复杂命令的输入,例如重定向stdout, stderr:
def redirect
call (void)close(1)
call (void)close(2)
call (int)open($arg0, 2)
call (int)open($arg0, 2)
end

之后就可以用

(gdb)redirect(“/dev/ttyp3”)

来把输入输出重定向到tty3 (这个/dev/tty3可以用 shell tty命令获得)
这个例子选自http://blogold.chinaunix.net/u3/111274/showart_2162256.html

此外,还可以给这个别名加上帮助说明性文字,格式为:
document user-defined-command
帮助说明性文字
end

例如:
document redirect
redirect stdout and stderr to arg0
end

.gdbinit中还可以定义hook函数(http://dev.firnow.com/course/6_system/linux/linuxjq/20090307/159416.html),
例如想在print命令前显示一段“———-”,:
define hook-print
echo ———-\n
end

.gdbinit会被GDB默认读取,如果有特定的配置文件,可以用source命令(类似bash的source命令)

(2)补充一些有用的命令

用whatis命令检查变量的类型,
ptype:比whatis的功能更强,他可以提供一个结构的定义,
commands 命中断点时,列出将要执行的命令
使用“rb”命令,如果执行“rb”时不带参数,则表示在所有函数处打一个断点,“rb”后面可以接一个符合正则表达式的参数,用来对符合正则表达式的所有函数打断点
info break 显示当前断点清单,包括到达断点处的次数等。
info files 显示被调试文件的详细信息。
info func 显示所有的函数名称。
info local 显示当函数中的局部变量信息。
info prog 显示被调试程序的执行状态。
info var 显示所有的全局和静态变量名称。
rwatch 当表达式(变量)expr被读时,停住程序。
awatch 当表达式(变量)的值被读或被写时,停住程序。
save breakpoints — Save current breakpoint definitions as a script
c [count] 表示连续(c)ontinue 多次

from: http://www.cppblog.com/true/archive/2009/01/11/71749.html

(3)print的两个技巧

(gdb)print $1 ($1为历史记录变量,在以后可以直接引用 $1 的值)
l 人为数组
人为数组提供了一种去显示存储器块(数组节或动态分配的存储区)内容的方法。早期的调试程序没有很好的方法将任意的指针换成一个数组。就像对待参数一样,让我们查看内存中在变量h后面的10个整数,一个动态数组的语法如下所示:
base@length
因此,要想显示在h后面的10个元素,可以使用h@10:
(gdb)print h@10
$13=(-1,345,23,-234,0,0,0,98,345,10)

http://moonwater.blogbus.com/logs/2256694.html

(4) GDB 其他应用:显示STL里的数据结构;画图等等

All from GDB wiki
美观的显示STL数据结构,比如std::string, std::vector…
http://sourceware.org/gdb/wiki/STLSupport

画one-dimensinoal图:
http://sourceware.org/gdb/wiki/PlottingFromGDB

其他有意思的extension:
比如检查libc的heap;美观的调试wxWidgets中的变量等等:
http://sourceware.org/gdb/wiki/HomePage

(5)GDB环境变量

(陈皓专栏 【空谷幽兰,心如皓月】 http://blog.csdn.net/haoel/archive/2003/07/02/2879.aspx)
你可以在GDB的调试环境中定义自己的变量,用来保存一些调试程序中的运行数据。要定
义一个GDB的变量很简单只需。使用GDB的set命令。GDB的环境变量和UNIX一样,
也是以$起头。如:
set $foo = *object_ptr
使用环境变量时,GDB会在你第一次使用时创建这个变量,而在以后的使用中,则直接对
其賦值。环境变量没有类型,你可以给环境变量定义任一的类型。包括结构体和数组。
show convenience
该命令查看当前所设置的所有的环境变量。
这是一个比较强大的功能,环境变量和程序变量的交互使用,将使得程序调试更为灵活便捷。
例如:
set $i = 0
print bar[$i++]->contents
于是,当你就不必,print bar[0]->contents, print bar[1]->contents地输入命令了。输入这样的
命令后,只用敲回车,重复执行上一条语句,环境变量会自动累加,从而完成逐个输出的功
能。

 

其他有益的参考

【1】GNU Project Debugger: More fun with GDB
此文中介绍了各种define的command,可以用来简化命令的输入。
【2】 陈皓博客:用GDB调试程序 包括的很详尽的对各种命令的介绍
【3】GDB中应该知道的几个调试方法 常用的几个GDB技巧,例如调试macro,条件断点,command命令等等。

 

BTW:

刚刚发现进入blog的时候又是白屏了,原因还是MySQL没有自动启动。
从这里找解决方法,希望管用:
http://ubuntuforums.org/showthread.php?t=1668170

sudo apt-get install sysv-rc-conf
sudo sysv-rc-conf
把mysql在level 2,3,4,5中选中。