http://blog.csdn.net/haoel/article/details/2881linux
GDB主要调试的是C/C++的程序。要调试C/C++的程序,首先在编译时,咱们必需要把调试信息加到可执行文件中。web
使用编译器(cc/gcc/g++)的 -g 参数能够作到这一点。若是没有-g,你将看不见程序的函数名、变量名,所代替的shell
全是运行时的内存地址。函数
ex: gcc -c hello.c -o hellospa
启动GDB的方法有如下几种:.net
一、gdb <program> program也就是你的执行文件,通常在固然目录下。线程
二、gdb <program> core 用gdb同时调试一个运行程序和core文件,core是程序非法执行后core dump后产生的文件。调试
三、gdb <program> <PID> 若是你的程序是一个服务程序,那么你能够指定这个服务程序运行时的进程ID。gdb会自动attach上去,并调试他。program应该在PATH环境变量中搜索获得。orm
help命令只是例出gdb的命令种类,若是要看种类中的命令,可使用help <class> 命令,如:help breakpointsblog
打断点
break 19 //在第十九行打断点(等同于 b 19)
b fun //fun为函数名,能够在进入时设置断点,函数名能够双击tab键补齐
在gdb中运行linux的shell命令
shell <command string>
ex: shell ls /home
在gdb中,运行程序使用r或是run命令。程序的运行,你有可能须要设置下面四方面的事。
一、程序运行参数。
set args 可指定运行时参数。(如:set args 10 20 30 40 50)
show args 命令能够查看设置好的运行参数。
二、运行环境。
path <dir> 可设定程序的运行路径。
show paths 查看程序的运行路径。
set environment varname [=value] 设置环境变量。如:set env USER=hchen show environment [varname] 查看环境变量。
三、工做目录。 cd <dir> 至关于shell的cd命令。 pwd 显示当前的所在目录。
四、程序的输入输出。
info terminal 显示你程序用到的终端的模式。
使用重定向控制程序输出。如:run > outfile tty命令能够指写输入输出的终端设备。如:tty /dev/ttyb
调试已运行的程序 ————————
两种方法:
一、在UNIX下用ps查看正在运行的程序的PID(进程ID),而后用gdb <program> PID格式挂接正在运行的程序。
二、先用gdb <program>关联上源代码,并进行gdb,在gdb中用attach命令来挂接进程的PID。并用detach来取消挂接的进程。
暂停 / 恢复程序运行 —————————
调试程序中,暂停程序运行是必须的,GDB能够方便地暂停程序的运行。你能够设置程序的在哪行停住,在什么条件下停住,在收到什么信号时停往等等。以便于你查看运行时的变量,以及运行时的流程。
当进程被gdb停住时,你可使用info program 来查看程序的是否在运行,进程号,被暂停的缘由。
在gdb中,咱们能够有如下几种暂停方式:断点(BreakPoint)、观察点(WatchPoint)、捕捉点(CatchPoint)、信号(Signals)、线程中止(Thread Stops)。若是要恢复程序运行,可使用c或是continue命令。
1、设置断点(BreakPoint)
咱们用break命令来设置断点。正面有几点设置断点的方法:
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时停住程序。
查看断点时,可以使用info命令,以下所示:(注:n表示断点号) info breakpoints [n] info break [n]
2、设置观察点(WatchPoint)
观察点通常来观察某个表达式(变量也是一种表达式)的值是否有变化了,若是有变化,立刻停住程序。咱们有下面的几种方法来设置观察点:
watch <expr>
为表达式(变量)expr设置一个观察点。一量表达式值有变化时,立刻停住程序。
rwatch <expr>
当表达式(变量)expr被读时,停住程序。
awatch <expr>
当表达式(变量)的值被读或被写时,停住程序。
info watchpoints
列出当前所设置了的全部观察点。
3、设置捕捉点(CatchPoint)
你可设置捕捉点来补捉程序运行时的一些事件。如:载入共享库(动态连接库)或是C++的异常。设置捕捉点的格式为:
catch <event> 当event发生时,停住程序。event能够是下面的内容:
一、throw 一个C++抛出的异常。(throw为关键字)
二、catch 一个C++捕捉到的异常。(catch为关键字)
三、exec 调用系统调用exec时。(exec为关键字,目前此功能只在HP-UX下有用)
四、fork 调用系统调用fork时。(fork为关键字,目前此功能只在HP-UX下有用)
五、vfork 调用系统调用vfork时。(vfork为关键字,目前此功能只在HP-UX下有用)
六、load 或 load <libname> 载入共享库(动态连接库)时。(load为关键字,目前此功能只在HP-UX下有用)
七、unload 或 unload <libname> 卸载共享库(动态连接库)时。(unload为关键字,目前此功能只在HP-UX下有用)
4、维护中止点
上面说了如何设置程序的中止点,GDB中的中止点也就是上述的三类。在GDB中,若是你以为已定义好的中止点没有用了,你可使用delete、clear、disable、enable这几个命令来进行维护。
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全部的中止点。简写命令是dis.
enable [breakpoints] [range...] enable所指定的中止点,breakpoints为中止点号。
enable [breakpoints] once range... enable所指定的中止点一次,当程序中止后,该中止点立刻被GDB自动disable。
enable [breakpoints] delete range... enable所指定的中止点一次,当程序中止后,该中止点立刻被GDB自动删除。
tcatch <event> 只设置一次捕捉点,当程序停住之后,应点被自动删除。