0
点赞
收藏
分享

微信扫一扫

和菜鸟一起深入学习国嵌实验之gcc分步编译&&gdb调试



gcc分步编译

 

1、编写简单例子


#include <stdio.h>

int main(void)
{
printf("Hello!\n");
return 0;
}



 

2、预处理生成hello.i


eastmoon@eastmoon-virtual-machine:~/work/guoqian/1/1.2$gcc -E hello.c -o hello.i
eastmoon@eastmoon-virtual-machine:~/work/guoqian/1/1.2$ls
hello.c hello.i



 

hello.i------à


…………………………
extern int pclose (FILE *__stream);


extern char *ctermid (char *__s) __attribute__((__nothrow__));
# 906 "/usr/include/stdio.h" 3 4
extern void flockfile (FILE *__stream)__attribute__ ((__nothrow__));

extern int ftrylockfile (FILE *__stream)__attribute__ ((__nothrow__)) ;

extern void funlockfile (FILE *__stream)__attribute__ ((__nothrow__));
# 936 "/usr/include/stdio.h" 3 4

# 2 "hello.c" 2

int main(void)
{
printf("Hello!\n");
return 0;



 

2、生成汇编代码helloS


eastmoon@eastmoon-virtual-machine:~/work/guoqian/1/1.2$gcc -S hello.i -o hello.S
eastmoon@eastmoon-virtual-machine:~/work/guoqian/1/1.2$ls
hello.c hello.i hello.S



 

hello.S----à

 

.file  "hello.c"
.section .rodata
.LC0:
.string "Hello!"
.text
.globl main
.type main, @function
main:
pushl %ebp
movl %esp, %ebp
andl $-16, %esp
subl $16, %esp
movl $.LC0, (%esp)
call puts
movl $0, %eax
leave
ret
.size main, .-main
.ident "GCC: (Ubuntu/Linaro 4.5.2-8ubuntu4)4.5.2"
.section .note.GNU-stack,"",@progbits



 

3、编译汇编代码生成hello.o


eastmoon@eastmoon-virtual-machine:~/work/guoqian/1/1.2$gcc -c hello.c -o hello.o
eastmoon@eastmoon-virtual-machine:~/work/guoqian/1/1.2$ls
hello.c hello.i hello.o hello.S



 

4、链接,生成可执行文件hello


eastmoon@eastmoon-virtual-machine:~/work/guoqian/1/1.2$ls
hello hello.c hello.i hello.o hello.S



 

5、运行可执行文件,输出Hello!


eastmoon@eastmoon-virtual-machine:~/work/guoqian/1/1.2$./hello
Hello!



 

gdb调试


1、  测试代码编写


#include <stdio.h>

int add(int x, int y)
{
return x+ y;
}

int main(void)
{
int a, b;

a = 4;
b = 5;

a =add(a, b);

printf("a+b = %d\n", a);

return 0;
}



 

2、编译代码生成可执行文件add


eastmoon@eastmoon-virtual-machine:~/work/guoqian/1/1.3$gcc -g add.c -o add
eastmoon@eastmoon-virtual-machine:~/work/guoqian/1/1.3$ls
add add.c



 

3、进入gdb调试


eastmoon@eastmoon-virtual-machine:~/work/guoqian/1/1.3$gdb add
GNU gdb (Ubuntu/Linaro 7.2-1ubuntu11) 7.2
Copyright (C) 2010 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 andredistribute it.
There is NO WARRANTY, to the extent permitted bylaw. Type "show copying"
and "show warranty" for details.
This GDB was configured as"i686-linux-gnu".
For bug reporting instructions, please see:
<http://www.gnu.org/software/gdb/bugs/>...
Reading symbols from /home/eastmoon/work/guoqian/1/1.3/add...done.
(gdb)



 

4、查看文件


(gdb) l
3 int add(int x, int y)
4 {
5 return x + y;
6 }
7
8 int main(void)
9 {
10 int a, b;
11
12 a = 4;
(gdb)
13 b = 5;
14
15 a = add(a, b);
16
17 printf("a+b =%d\n", a);
18
19 return 0;
20 }
21



 

5、设置断点


(gdb) b 15
Breakpoint 1 at 0x80483eb: file add.c, line 15.



6、查看断点信息


(gdb) info b
Num Type Disp EnbAddress What
1 breakpoint keep y 0x080483eb in main at add.c:15



7、运行代码


(gdb) r
Starting program:/home/eastmoon/work/guoqian/1/1.3/add

Breakpoint 1, main () at add.c:15
15 a =add(a, b);



8、查看变量值


(gdb) p a
$1 = 4
(gdb) p b
$2 = 5



 

9、单步运行,可进入函数


(gdb) s
add (x=4, y=5) at add.c:5
5 return x + y;
(gdb) s
6 }
(gdb) s
main () at add.c:17
17 printf("a+b = %d\n", a);

(gdb) p a
$3 = 9
(gdb) p b
$4 = 5



 

10、单步运行,不可进入函数


(gdb) n
a+b = 9
19 return 0;



 

11、运行程序,直到函数结束


(gdb) finish
"finish" not meaningful in the outermostframe.



12、恢复程序运行


(gdb) c
Continuing.

Program exited normally.



13、退出gdb调试


(gdb) q


 

举报

相关推荐

0 条评论