GDB
编译需要加-g ,运行 gdb (program程序名)
/*简单说明
b channel_window.c:458 在文件的行数添加断点
CTRL+C 暂停程序
CTRL+Z 切到后台,此时可以查看free内存情况
fg 回到前台
c 继续执行
*/
0. run 执行代码
1. break 16 在第几行打断点
break <function>
在进入指定函数时停住。C++中可以使用class::function或function(type,type)格式来指定函数名。 break <linenum>
在指定行号停住。 break +offset
break -offset
在当前行号的前面或后面的offset行停住。offiset为自然数。 break filename:linenum
在源文件filename的linenum行处停住。 break filename:function
在源文件filename的function函数的入口处停住。 break *address
在程序运行的内存地址处停住。 break
break命令没有参数时,表示在下一条指令处停住。 break ... if <condition> ...可以是上述的参数,condition表示条件,在条件成立时停住。比如在循环境体中,可以设置break if i=100,表示
当i为100时停住程序
2. c 继续运行程序
3. n 单步运行程序
4. break func 在函数添加断点 , b func
5. info break 查看断点
6.p i 查看变量
7. l 列出代码
8. quit, q 退出
9. gdb (program) core 用gdb同时调试一个运行程序和core文件
10. gdb (program) (PID) 程序是一个服务程序,指定这个服务程序运行时的进程ID,gdb会自动attach上去,并调试它。
常用的启动开关
-symbols <file>
-s <file> 从指定文件中读取符号表
-se file 从指定文件中读取符号表信息,并把他用在可执行文件中
-core <file>
-c <file> 调试时core dump的core 文件
-directory <directory>
-d <directory> 加入一个源文件的搜索路径。默认搜索路径是环境变量PATH中定义的路径
1、程序运行参数。 set args 可指定运行时参数。(如:set args 10 20 30 40 50)
show args 命令可以查看设置好的运行参数。
2、运行环境。 path <dir> 可设定程序的运行路径。 show paths 查看程序的运行路径。 set environment varname [=value] 设置环境变量。如:set env USER=hchen
show environment [varname] 查看环境变量。
3、工作目录。 cd <dir> 相当于shell的cd命令。 pwd 显示当前的所在目录。
4、程序的输入输出。 info terminal 显示你程序用到的终端的模式。 使用重定向控制程序输出。如:run > outfile
tty命令可以指写输入输出的终端设备。如:tty /dev/tty
调试已运行的程序
————————
两种方法: 1、在UNIX下用ps查看正在运行的程序的PID(进程ID),然后用gdb <program> PID格式挂接正在运行的程序。 2、先用gdb <program>关联上源代码,并进行gdb,在gdb中用attach命令来挂接进程的PID。并用detach来取消挂接的进程
暂停 / 恢复程序运行 —————————
调试程序中,暂停程序运行是必须的,GDB可以方便地暂停程序的运行。你可以设置程序的在哪行停住,在什么条件下停
住,在收到什么信号时停往等等。以便于你查看运行时的变量,以及运行时的流程。 当进程被gdb停住时,你可以使用info program 来查看程序的是否在运行,进程号,被暂停的原因。
在gdb中,我们可以有以下几种暂停方式:
断点(BreakPoint)
观察点(WatchPoint):
watch <expr>
为表达式(变量)expr设置一个观察点。一量表达式值有变化时,马上停住程序。
rwatch <expr>
当表达式(变量)expr被读时,停住程序。
awatch <expr>
当表达式(变量)的值被读或被写时,停住程序。
info watchpoints
列出当前所设置了的所有观察点
捕捉点(CatchPoint):
载入共享库(动态链接库)或是C++的异常。设置捕捉点的格式为:
catch <event>
当event发生时,停住程序。event可以是下面的内容: 1、throw 一个C++抛出的异常。(throw为关键字)
2、catch 一个C++捕捉到的异常。(catch为关键字)
3、exec 调用系统调用exec时。(exec为关键字,目前此功能只在HP-UX下有用)
4、fork 调用系统调用fork时。(fork为关键字,目前此功能只在HP-UX下有用)
5、vfork 调用系统调用vfork时。(vfork为关键字,目前此功能只在HP-UX下有用)
6、load 或 load <libname> 载入共享库(动态链接库)时。(load为关键字,目前此功能只在HP-UX下有用)
7、unload 或 unload <libname> 卸载共享库(动态链接库)时。(unload为关键字,目前此功能只在HP-UX下有用)
tcatch <event>
只设置一次捕捉点,当程序停住以后,应点被自动删除
信号(Signals)
信号是一种软中断,是一种处理异步事件的方法。一般来说,操作系统都支持许多信号。尤其是UNIX,比较重要应用程
序一般都会处理信号。UNIX定义了许多信号,比如SIGINT表示中断字符信号,也就是Ctrl+C的信号,SIGBUS表示硬件故
障的信号;SIGCHLD表示子进程状态改变信号;SIGKILL表示终止程序运行的信号,等等。信号量编程是UNIX下非常重要
的一种技术。
GDB有能力在你调试程序的时候处理任何一种信号,你可以告诉GDB需要处理哪一种信号。你可以要求GDB收到你所指定的
信号时,马上停住正在运行的程序,以供你进行调试。你可以用GDB的handle命令来完成这一功能
线程停止(Thread Stops)
如果要恢复程序运行,可以使用c或是continue命令
清楚停止点
clear清除所有的已定义的停止点。 clear <function>
clear <filename:function>
清除所有设置在函数上的停止点。 clear <linenum>
clear <filename:linenum>
清除所有设置在指定行上的停止点。 delete [breakpoints] [range...]
删除指定的断点,breakpoints为断点号。如果不指定断点号,则表示删除所有的断点。range 表示断点号的范3-7)。其简写命令为d。
比删除更好的一种方法是disable停止点,disable了的停止点,GDB不会删除,当你还需要时,enable即可,就站一样。 disable [breakpoints] [range...]
disable所指定的停止点,breakpoints为停止点号。如果什么都不指定,表示disable所有的停止点。简写命令enable [breakpoints] [range...]
enable所指定的停止点,breakpoints为停止点号。 enable [breakpoints] once range... enable所指定的停止点一次,当程序停止后,该停止点马上被GDB自动disable。 enable [breakpoints] delete range... enable所指定的停止点一次,当程序停止后,该停止点马上被GDB自动删除。 五、停止条件维护
前面在说到设置断点时,我们提到过可以设置一个条件,当条件成立时,程序自动停止,这是一个非常强大的功里,我想专门说说这个条件的相关维护命令。一般来说,为断点设置一个条件,我们使用if关键词,后面跟其断件。并且,条件设置好后,我们可以用condition命令来修改断点的条件。(只有break和watch命令支持if,ca暂不支持if)
condition <bnum> <expression>
修改断点号为bnum的停止条件为expression。 condition <bnum>
清除断点号为bnum的停止条件。
还有一个比较特殊的维护命令ignore,你可以指定程序运行时,忽略停止条件几次。 ignore <bnum> <count>
表示忽略断点号为bnum的停止条件count次。
浙公网安备 33010602011771号