调试器在任何软件开发系统中都起着至关重要的作用。 没有人可以一次性编写一个无错误的代码。 在开发过程中,错误正在升高,需要解决以进一步增强。 没有调试器的开发系统是不完整的。 考虑到开源开发人员社区,GNU Debugger是他们的最佳选择。 它也用于UNIX类型平台上的商业软件开发。
使用GNU Debugger调试源代码
GNU调试器 ,也被称为GDB,允许我们通过代码潜行而其执行或什么程序试图在此刻做前坠毁。 GDB基本上帮助我们做四个主要的事情来抓住源代码中的缺陷。
- 启动程序,指定可能影响一般行为的参数。
- 在指定条件下停止程序。
- 检查崩溃或程序停止时。
- 更改代码并即时实验修改的代码。
我们可以使用gdb来写在C和C ++不费力的调试程序。 截至目前对于如D其他编程语言的支持,Modula-2的 ,Fortran的是局部的。
GNU Debugger或GDB入门
GDB使用gdb命令调用。 关于印发GDB,它会显示有关平台的一些信息,按照下图你滴进(GDB)的提示。
[root@fedora20 ~]# gdb
示例输出
GNU gdb (GDB) Fedora 7.6.50.20130731-19.fc20 Copyright (C) 2013 Free Software Foundation, Inc. License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html> 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-redhat-linux-gnu". Type "show configuration" for configuration details. For bug reporting instructions, please see: <http://www.gnu.org/software/gdb/bugs/>. Find the GDB manual and other documentation resources online at: <http://www.gnu.org/software/gdb/documentation/>. For help, type "help". Type "apropos word" to search for commands related to "word". (gdb)
键入help列表的可用GDB内部不同类别的命令。 类型帮助后跟一个类名称在该类的命令的列表。 键入help所有的所有命令的列表。 如果命令名缩写无歧义,则允许使用。 例如,您可以输入下一个或c打字继续等氮代替。
最常用的GDB命令
常用gdb命令列出在下表中。 这些命令是从gdb的命令提示符(GDB)使用。
命令
|
描述
|
跑
|
启动程序执行
|
放弃
|
退出gdb
|
打印expr
|
打印表达式,其中Expr 可以是变量名太
|
下一个
|
转到下一行
|
步
|
进入下一行
|
继续
|
从当前行继续,直到程序结束或下一个断点
|
注意两个命令步骤和下一个之间的差异。 接下来的命令不进去功能,如果下一行是一个函数调用。 而步命令可以去里面的功能,看看那里发生。
使用GDB的示例会话
考虑下面的源代码。
// sum.c #include <stdio.h> int sum (int a, int b) { int c; c = a + b; return c; } int main() { int x, y, z; printf("\nEnter the first number: "); scanf("%d", &x); printf("Enter the second number: "); scanf("%d", &y); z = sum (x, y); printf("The sum is %d\n\n", z); return 0; }
为了调试输出文件,我们需要-g选项相同的编译到GCC如下。
$ gcc -g sum.c -o sum
输出文件和可以通过以下任一2种方式连接到GDB:
1.通过将输出文件指定为gdb的参数。
$ gdb sum
内部使用文件命令GDB 2.运行输出文件。
$ gdb (gdb) file sum
list命令列出了源代码文件的线条和移动指针。 因此,首先列表将显示前10行和下一个列表显示,未来10等。
(gdb) list 1 #include <stdio.h> 2 3 int sum (int a, int b) { 4 int c; 5 c = a + b; 6 return c; 7 } 8 9 int main() { 10 int x, y, z;
要开始执行,发出运行命令。 现在程序正常执行。 但是我们忘了在源代码中放置一些断点用于调试,对吗? 可以为函数或指定的行指定这些断点。
(gdb) b main
注 :我使用的缩写b。对于休息 。
在主功能设置断点后,重新运行程序将在第11行停止。如果之前已知行号,同样的事情可以生效。
(gdb) b sum.c:11
现在,通过使用一个或n命令的代码行步骤。 要注意的是下一个命令不内部功能码去除非断点设置在功能是重要的。 现在,让我们尝试一下打印命令。 在函数sum上设置断点如下。
(gdb) b sum Breakpoint 1 at 0x4005aa: file sum.c, line 5. (gdb) r Starting program: /root/sum Enter the first number: 2 Enter the second number: 3 Breakpoint 1, sum (a=2, b=3) at sum.c:5 5 c = a + b; (gdb) p a $1 = 2 (gdb) p b $2 = 3 (gdb) c Continuing. The sum is 5 [Inferior 1 (process 3444) exited normally]
如果程序正在运行需要命令行参数,然后提供与运行命令沿相同。
(gdb) run . . .
与当前正在运行的程序关联的共享库文件可以列为。
(gdb) info share From To Syms Read Shared Object Library 0x00000035a6000b10 0x00000035a6019c70 Yes /lib64/ld-linux-x86-64.so.2 0x00000035a641f560 0x00000035a6560bb4 Yes /lib64/libc.so.6
修改变量
GDB也能够在整个程序执行修改变量。 让我们试试这个。 如上所述,在第16行设置断点并运行程序。
(gdb) r Starting program: /root/sum Enter the first number: 1 Enter the second number: 2 Breakpoint 1, main ( ) at sum.c:16 16 printf("The sum is %d\n\n", z); (gdb) set z=4 (gdb) c Continuing. The sum is 4
现在A = 1,B = 2的结果应该是Z = 3。但在这里,我们在主函数改变最终的结果到z = 4。 这样,使用gdb可以使调试变得更容易。
启用/禁用断点
要获得所有断点类型信息的断点列表中 。
(gdb) info breakpoints Num Type Disp Enb Address What 1 breakpoint keep y 0x00000000004005c2 in main at sum.c:11
这里只有一个断点,它是To。 启用禁用断点与禁用命令沿着指定断点号。 为了使以后使用enable命令。
(gdb) disable 1 (gdb) info breakpoints Num Type Disp Enb Address What 1 breakpoint keep n 0x00000000004005c2 in main at sum.c:11
您也可以删除与delete命令断点。
调试运行进程
许多进程在后台运行在GNU / Linux系统中。 首先我们需要找到特定进程的进程ID调试一个正在运行的进程。 的pidof命令给你一个进程的PID。
$ pidof <process_name>
现在,我们需要将此pid附加到gdb。 有2种方法。
1.通过与gdb一起指定pid。
$ gdb -p <pid>
2.使用从GDB attach命令。
(gdb) attach <pid>
目前为止就这样了。 这些只是gdb的基础知识,以便在调试源代码中获得良好的开端,而且它比上面解释的东西更多。 例如,我们可以使用信息,环境变量和更多。 试着玩所有这些东西...