使用 GNU GCC 和 GDB 开发调试应用程序
gcc 命令的使用
在使用GCC编译程序时,编译过程可以被细分为四个阶段:
- 预处理(Pre-Processing)
- 编译(Compiling)
- 汇编(Assembling)
- 链接(Linking)
如果不加任何参数, gcc 默认执行所有的操作,直接生成可执行文件。
以上四个阶段对应参数为:
1. -E 只执行预处理
2. –S 只编译,不汇编和链接
3. –c 编译汇编不链接
4. –o 链接成目标文件
GCC常用选项
-c 通知GCC取消链接步骤,即编译源码并在最后生成目标文件;
-Dmacro 定义指定的宏,使它能够通过源码中的#ifdef进行检验;
-E 不经过编译预处理程序的输出而输送至标准输出;
-g3 获得有关调试程序的详细信息,它不能与-o选项联合使用;
-Idirectory 在包含文件搜索路径的起点处添加指定目录;
-llibrary 提示链接程序在创建最终可执行文件时包含指定的库;
-O、-O2、-O3 将优化状态打开,该选项不能与-g选项联合使用;
-S 要求编译程序生成来自源代码的汇编程序输出;
-v 启动所有警报;
-Wall 在发生警报时取消编译操作,即将警报看作是错误;
-Werror 在发生警报时取消编译操作,即把报警当作是错误;
-w 禁止所有的报警。
gdb 调试工具的使用
基本gdb命令:
---------------------------------------------------------------------
命令 简写 功能
---------------------------------------------------------------------
file 装入想要调试的可执行文件.
kill k 终止正在调试的程序.
list l 列出产生执行文件的源代码的一部分.
next n 执行一行源代码但不进入函数内部.
step s 执行一行源代码而且进入函数内部.
continue c 继续执行程序,直至下一中断或者程序结束。
run r 执行当前被调试的程序.
quit q 终止 gdb.
watch 使你能监视一个变量的值而不管它何时被改变.
catch 设置捕捉点.
thread t 查看当前运行程序的线程信息.
break b 在代码里设置断点, 这将使程序执行到这里时被挂起.
make 使你能不退出 gdb 就可以重新产生可执行文件.
shell 使你能不离开 gdb 就执行 UNIXshell 命令.
print p 打印数据内容。
examine x 打印内存内容。
backtracebt 查看函数调用栈的所有信息。
实例分析
代码:
#define _GNU_SOURCE #include <string.h> #include <stdio.h> #include <stdlib.h> #define info(addr) printf("%30s @ %12p\n", #addr, &addr) int global_var = 1; static int static_global_var = 2; int local_function(int var) { int local_function_var = var; static int static_local_function_var = 6; info(static_local_function_var); info(local_function_var); return local_function_var; } int main(int argc, char *argv[]) { local_function(0); int main_function_var = 3; static int static_main_var = 4; info(global_var); info(static_global_var); info(static_main_var); info(main_function_var); info(main); info(local_function); return 0; }
编译可调式的目标文件并运行:
jxdong@ubuntu-server:~/workspace/test$ gcc-o test test.c jxdong@ubuntu-server:~/workspace/test$./test static_local_function_var @ 0x60102c local_function_var @ 0x7fffc2487a3c global_var @ 0x601020 static_global_var @ 0x601024 static_main_var @ 0x601028 main_function_var @ 0x7fffc2487a6c main @ 0x400541 local_function @ 0x4004f4
jxdong@ubuntu-server:~/workspace/test$ gcc-o test -g test.c
jxdong@ubuntu-server:~/workspace/test$./test
static_local_function_var @ 0x60102c
local_function_var @ 0x7fff97a0869c
global_var @ 0x601020
static_global_var @ 0x601024
static_main_var @ 0x601028
main_function_var @ 0x7fff97a086cc
main @ 0x400541
local_function @ 0x4004f4
jxdong@ubuntu-server:~/workspace/test$ gdb./test
GNU gdb (Ubuntu/Linaro7.4-2012.04-0ubuntu2) 7.4-2012.04
Copyright (C) 2012 Free SoftwareFoundation, Inc.
License GPLv3+: GNU GPL version 3 or later<http://gnu.org/licenses/gpl.html>
This is free software: you are free tochange and redistribute it.
There is NO WARRANTY, to the extentpermitted by law. Type "showcopying"
and "show warranty" for details.
This GDB was configured as"x86_64-linux-gnu".
For bug reporting instructions, please see:
<http://bugs.launchpad.net/gdb-linaro/>...
Reading symbols from/home/jxdong/workspace/test/test...done.
(gdb) b 32
Breakpoint 1 at 0x400608: file test.c, line32.
(gdb) run
Starting program:/home/jxdong/workspace/test/test
static_local_function_var @ 0x60102c
local_function_var @ 0x7fffffffe24c
global_var @ 0x601020
static_global_var @ 0x601024
static_main_var @ 0x601028
main_function_var @ 0x7fffffffe27c
main @ 0x400541
local_function @ 0x4004f4
Breakpoint 1, main (argc=1,argv=0x7fffffffe368) at test.c:32
32 return 0;
(gdb) bt full
#0 main (argc=1, argv=0x7fffffffe368) at test.c:32
main_function_var = 3
static_main_var = 4
(gdb) info proc
process 32545
cmdline = ‘/home/jxdong/workspace/test/test‘
cwd = ‘/home/jxdong/workspace/test‘
exe = ‘/home/jxdong/workspace/test/test‘
(gdb)
process 32545
cmdline =‘/home/jxdong/workspace/test/test‘
cwd = ‘/home/jxdong/workspace/test‘
exe = ‘/home/jxdong/workspace/test/test‘
(gdb) info proc map
process 32545
Mapped address spaces:
Start Addr End Addr Size Offset objfile
0x400000 0x401000 0x1000 0x0 /home/jxdong/workspace/test/test
0x600000 0x601000 0x1000 0x0 /home/jxdong/workspace/test/test
0x601000 0x602000 0x1000 0x1000 /home/jxdong/workspace/test/test
0x7ffff7a1a000 0x7ffff7bcf000 0x1b5000 0x0 /lib/x86_64-linux-gnu/libc-2.15.so
0x7ffff7bcf000 0x7ffff7dcf000 0x200000 0x1b5000 /lib/x86_64-linux-gnu/libc-2.15.so
0x7ffff7dcf000 0x7ffff7dd3000 0x4000 0x1b5000 /lib/x86_64-linux-gnu/libc-2.15.so
0x7ffff7dd3000 0x7ffff7dd5000 0x2000 0x1b9000 /lib/x86_64-linux-gnu/libc-2.15.so
0x7ffff7dd5000 0x7ffff7dda000 0x5000 0x0
0x7ffff7dda000 0x7ffff7dfc000 0x22000 0x0 /lib/x86_64-linux-gnu/ld-2.15.so
0x7ffff7fe9000 0x7ffff7fec000 0x3000 0x0
0x7ffff7ff8000 0x7ffff7ffb000 0x3000 0x0
0x7ffff7ffb000 0x7ffff7ffc000 0x1000 0x0 [vdso]
0x7ffff7ffc000 0x7ffff7ffd000 0x1000 0x22000 /lib/x86_64-linux-gnu/ld-2.15.so
0x7ffff7ffd000 0x7ffff7fff000 0x2000 0x23000 /lib/x86_64-linux-gnu/ld-2.15.so
0x7ffffffde000 0x7ffffffff000 0x21000 0x0 [stack]
0xffffffffff600000 0xffffffffff601000 0x1000 0x0 [vsyscall]
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。