debug——C语⾔编译时候进⾏debug的调试
gdb是的简称。它是⼀款UNIX平台的调试器(debugger),可⽤于为C, C++, Objective-C, Java, Fortran等程序debug。
在gdb中,你可以通过设置断点(break point)来控制程序运⾏的进度,并查看断点时的变量和函数调⽤状况,从⽽发现可能的问题。在许多IDE中,gdb拥有图形化界⾯。
⼀、初次使⽤gdb调试器,出现的No symbol table is loaded. Use the "file" command.问题:
⾸先使⽤gcc -g .c⽂件 -o 可执⾏⽂件名 进⾏编译;再使⽤gdb + 可执⾏⽂件名进⼊gdb环境,进⾏调试。
为了使⽤gdb对进⾏调试,必须使⽤-g选项(在编译时⽣成debug信息)
命令如下如:
#gcc -g test.c -o test
#gdb test
如果上⼀步gdb + 不是 -g编译后的 可执⾏⽂件,⽽是 gdb ./a.out ,则会出现 Use the "file" command.问题
(gdb)list
list命令是⽤来列出源码的。
详细的list的使⽤查看⽂章《》
(2) gdb test
(3) list等gdb命令;
(如有必要,使⽤:$chmod +x test来增加⽤户的执⾏权限。)
⼆、使⽤gdb调试:
1》启动gdb:
[root@node-2 jieer]# gcc -g struct.c -o struct
[root@node-2 jieer]# gdb struct
2》显⽰程序:详细的list的使⽤查看⽂章《》
<1> 将显⽰以第3⾏为中⼼,总共10⾏的程序。
如果要查看某个⽂件中的内容,需要说明⽂件名(例如:(gdb) list struct.c:12)。
(gdb) list 3
<2>可以具体说明所要列出的程序⾏的范围(即 显⽰5-15⾏的程序).
(gdb) list 5,15
<3>显⽰某个函数.
(gdb) list main
3》设置断点
<1>我们可以在程序的某⼀⾏设置断点,⽐如:
(gdb) break 16 (或者是简写 b 16)
将在test.c的第16⾏设置断点。
program可以删除吗
<2>你可以查看⾃⼰设置的断点:
(gdb) info break
<3>每个断点有⼀个识别序号。我们可以根据序号删除某个断点:
(gdb) delete 1
<4>也可以删除所有断点:
(gdb) delete breakpoints
到⽬前为⽌,程序内变量的赋值都是在程序内部完成的,如果程序内的⼀些变量需要执⾏⽂件的时候,⽤命令⾏传⼊呢?例如:需要你打印出argv[0]、argv[1]、argv[2]的值得⼀个函数你该如何操作呢?
《》
4》保存断点
<1>
(gdb) info break
Num Type Disp Enb Address What
1 breakpoint keep y 0x0000000000400536 in main at struct.c:12
2 breakpoint keep y 0x0000000000400547 in main at struct.c:13
<2>
(gdb) save breakpoint fig.dp
Saved to file 'fig.dp'.
<3>
[root@node-2 jieer]# gdb struct -x fig.dp
GNU gdb (GDB) Red Hat Enterprise Linux 7.6.1-100.el7_4.1
Copyright (C) 2013 Free Software Foundation, Inc.
This is free software: you are free to change and redistribute it.
There is NO WA RRANTY, to the extent permitted by law. Type "show copying" and "show warranty" for details.
This GDB was configured as "x86_64-redhat-linux-gnu".
For bug reporting instructions, please see:
Reading symbols from /root/done.
Breakpoint 1 at 0x400536: file struct.c, line 12.
Breakpoint 2 at 0x400547: file struct.c, line 13.
5》运⾏控制
<1>让程序从断点开始,再多运⾏⼀⾏(可以看函数内嵌套的另⼀个函数的内容):
(gdb) step (可以⽤简写 s)
源代码:
21 int ccc(){
22 int total = 0;
23 char other[512] = {'\0'};
24
25 bbb(&total);
26 printf("ccc:total=%d\n",total);
27 printf("ccc:total=%p\n",&total);
28 ddd(other);
29 }
30 int main(){
31 ccc();
32 return 0;
33 }
步骤1:在⽂件内第30⾏设置⼀个断点,即在test.c⽂件,mian函数中第30 ⾏。
步骤2:运⾏程序:可以看到执⾏到ccc()函数哪⼀⾏了;
步骤3:执⾏s命令:从此处开始多运⾏⼀⾏,进⼊ccc()函数内部;
步骤4,5:继续调试函数:看到bbb()函数,这是很确定我们进⼊了ccc()函数中了。
那么不⽤s命令会有怎么的结果呢?我们来看⼀下
<2>也可以使⽤下⾯命令,从断点恢复运⾏,直到下⼀个断点: (gdb) continue
<3>使⽤run重新开始运⾏
(gdb) run
程序正常结束。
6》退出
使⽤下⾯命令退出gdb:
(gdb) quit (可以使⽤简写 q 或者 .qu)
三、举例分析:
1》struct.c⽂件的源码如下:
1 #include<stdio.h>
2 #include<stdlib.h>
3 #include<string.h>
4 struct student
5 {
6 char *name;
7 int score;
8 }stu,*pstu;
9
10 int main()
11 {
12 stu.name = (char *)malloc(20*sizeof(char));
13 strcpy(stu.name,"jie");
14 stu.score = 90;
15
16 pstu = (struct student *)malloc(sizeof(struct student));
17 pstu->name = (char *)malloc(20*sizeof(char));
18 strcpy(pstu->name,"jieer");
19 pstu->score = 9;
20
21 return 0;
22 }
2》具体操作如下:
[root@node-2 jieer]# gcc -g struct.c -o struct
[root@node-2 jieer]# gdb struct
(gdb) break 12
Breakpoint 1 at 0x400536: file struct.c, line 12.
(gdb) break 13
Breakpoint 2 at 0x400547: file struct.c, line 13.
(gdb) r
Starting program: /root/jieer/struct
Breakpoint 1, main () at struct.c:12
12 stu.name = (char *)malloc(20*sizeof(char));
Missing separate debuginfos, use: debuginfo-install glibc-2.17-196.el7_4.2.x86_64 (gdb) p stu.name
$1 = 0x0
(gdb) c
Continuing.
Breakpoint 2, main () at struct.c:13
13 strcpy(stu.name,"jie");
(gdb) p stu.name
$2 = 0x602010 ""
(gdb) quit
A debugging session is active.
Inferior 1 [process 12909] will be killed.
Quit anyway? (y or n) y
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论