GDB调试工具使用总结

1、使用前须知 一般来说GDB主要调试的是C/C++的程序。要调试C/C++的程序,首先在编译时,我们必须要把调试信息加到可执行文件中。使用编译器(gcc/gcc/g++)的 -g 参数可以做到这一点。如: gcc -g hello.c -o hello g++ -g hello.cpp -o hello 如果没有-g,你将看不见程序的函数名、变量名,所代替的全是运行时的内存地址。当你用-g把调试信息加入之后,并成功编译目标代码以后,让我们来看看如何用gdb来调试他。

2、GDB启动方式 1)gdb “program”(常用) program是你的C/C++源文件编译成功后的产生可执行文件,一般在当前目录下。 2) gdb “program” core 用gdb同时调试一个运行程序和core文件; core是程序非法执行后core dump后产生的文件。 3) gdb “program”“PID” 如果你的程序是一个服务程序,那么你可以指定这个服务程序运行时的进程ID。gdb会自动attach上去,并调试他。program应该在PATH环境变量中搜索得到。

3、GDB启动后的环境 $ gdb GNU gdb 6.7.1-debian Copyright (C) 2007 Free Software Foundation, Inc. License GPLv3+: GNU GPL version 3 or later This is free software: you are free to change and redistribute it. There is NO WARRANTY, to the extent permitted by law. Type “show copying” and “show warranty” for details. This GDB was configured as “x86_64-linux-gnu”. (gdb) ###——->此处出入命令

注意:gdb的命令可以使用help命令来查看,help命令只是例出gdb的命令种类,如果要看种类中的命令,可以使用help “class”命令,如:help breakpoints,查看设置断点的所有命令。也可以直接help “command“ 来查看命令的帮助。

4、GDB命令输入 gdb中,输入命令时,可以不用打全命令,只用打命令的前几个字符就可以了,当然,命令的前几个字符应该要标志着一个唯一的命令,在Linux下,你可以敲击两次TAB键来补齐命令的全称,如果有重复的,那么gdb会把其例出来。 For example: 1)在进入函数func时,设置一个断点。可以敲入break func,或是直接就是b func (gdb) b func Breakpoint 1 at 0x8048458: file hello.c, line 10.

2)敲入b按两次TAB键,你会看到所有b打头的命令: (gdb) b backtrace break bt

3)只记得函数的前缀,可以这样: (gdb) b make_ <按TAB键> (再按下一次TAB键,你会看到:) make_a_section_from_file make_environ make_abs_section make_function_type make_blockvector make_pointer_type make_cleanup make_reference_type make_command make_symbol_completion_list (gdb) b make_ GDB把所有make开头的函数全部例出来给你查看。

4)调试C++的程序时,有可以函数名一样。如: (gdb) b ‘bubble( M-? bubble(double,double) bubble(int,int) (gdb) b ‘bubble( 你可以查看到C++中的所有的重载函数及参数。(注:M-?和“按两次TAB键”是一个意思)

5、GDB程序运行中 当以gdb ”program“方式启动gdb后,gdb会在PATH路径和当前目录中搜索 ”program“ 的源文件。如要确认gdb是否读到源文件,可使用l或list命令,看看gdb是否能列出源代码。在gdb中,运行程序使用r或是run命令。

6、调试已运行的程序 两种方法: 1、在 Linux 下用 ps 命令 查看正在运行的程序的PID(进程ID),然后用gdb ”program” PID格式挂接正在运行的程序。 2、先用gdb “program” 关联上源代码,并进行gdb,在gdb中用attach命令来挂接进程的PID,用detach来取消挂接的进程。

7、GDB中如何暂停/恢复程序运行 调试程序中,暂停程序运行是必须的,GDB可以方便地暂停程序的运行。你可以设置程序的在哪行停住,在什么条件下停住,在收到什么信号时停往等等。以便于你查看运行时的变量,以及运行时的流程。 当进程被gdb停住时,你可以使用info program来查看程序的是否在运行,进程号,被暂停的原因。 在gdb中,我们可以有以下几种暂停方式:断点(BreakPoint)、观察点(WatchPoint)、捕捉点(CatchPoint)、信号(Signals)、线程停止(Thread Stops)。如果要恢复程序运行,可以使用c或是continue命令。 1)设置断点的方式

break “function” 在进入指定函数时停住。

break “linenum” 在指定行号停住

break +或- offset 在当前行号的前面或后面的offset行停住。offset为自然数

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 breakpoints [n] 查看断点时,可使用info命令,(注:n表示断点号)

2)关于设置观察点 ① 作用:观察点一般来观察某个表达式(变量也是一种表达式)的值是否有变化了,如果有变化,马上停住程序。 ② 如何设置: watch < expr >为表达式(变量)expr设置一个观察点。一但表达式值有变化时,马上停住程序。 rwatch < expr >当表达式(变量)expr 被读时,停住程序。 awatch < expr >当表达式(变量)的值被读或被写时,停住程序。 info watchpoints 列出当前所设置了的所有观察点。

3)关于设置捕捉点 ① 作用:你可设置捕捉点来捕捉程序运行时的一些事件。 如:载入共享库(动态链接库)或是C++的异常。 ② 如何设置:catch < event >和tcatch < event >, 可用 help catch 和 help tcatch 来看具体用法。

//以上断点、观察点和捕捉点为GDB中三类断点。

4)停止点维护 ① 作用:在GDB中,如果你觉得已定义好的停止点(即上述三类断点)没有用了,你可以使用delete、clear、disable、enable这几个命令来进行维护。 ② 具体操作: clear:清除停止点。 clear < function >,clear < filename:function > 作用:清除所有设置在函数上的停止点。 clear < linenum >,clear < filename:linenum > 作用:清除所有设置在指定行上的停止点。

delete:删除断点 delete [breakpoints] [range…] 作用: 删除指定的断点,breakpoints为断点号。如果不指定断点号,则表示删除所有的断点。range 表示断点号的范围,其简写命令为d。

创造条件,去改变生活,做生活的强者.愿你早日成为生活的强者

GDB调试工具使用总结

相关文章:

你感兴趣的文章:

标签云: