gdb

GDB是一个由GNU开源组织发布的、UNIX/LINUX操作系统下的、基于命令行的、功能强大的程序调试工具。

$gcc -g -o sample.o sample.c
使用 -o 参数指定了编译生成的可执行文件名为 gdb-sample,使用参数 -g 表示将源代码信息编译到可执行文件中。
如果不使用参数-g会给后面的GDB调试造成不便。当然,如果我们没有程序的源代码,自然也无从使用 -g 参数,调试/跟踪时也只能是汇编代码级别的调试/跟踪。

gdb调试命令说明
:~/c$ gcc -g -o sample.o sample.c
:~/c$ gdb
GNU gdb (Ubuntu/Linaro 7.4-2012.04-0ubuntu2.1) 7.4-2012.04
Copyright (C) 2012 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-linux-gnu".
For bug reporting instructions, please see:
<http://bugs.launchpad.net/gdb-linaro/>.
(gdb)

上面最后一行“(gdb) ”为GDB内部命令引导符,等待用户输入GDB命令

  //sample.c
1 #include<stdio.h> 2 3 int test(int size) { 4 size = size + 2; 5 return size; 6 } 7 8 void main(int argc, char **argv) { 9 printf("main\n"); 10 11 int size = 4; 12 int last = test(size); 13 14 printf("last:%d\n", last); 15 }

(gdb) file sample.o         //file命令载入被调试程序
Reading symbols from /home/daichenghui/c/sample.o...done.
(gdb) r                     //执行被调试文件
Starting program: /home/daichenghui/c/sample.o
warning: no loadable sections found in added symbol-file system-supplied DSO at 0x7ffff7ffa000
main
last:5
[Inferior 1 (process 19842) exited with code 07]
(gdb)
(gdb) q       //退出


//插入断点调试
(gdb) file sample.o
Reading symbols from /home/daichenghui/c/sample.o...done.
(gdb) b 4   //第4行插入断点
Breakpoint 1 at 0x40054b: file sample.c, line 4.
(gdb) r
Starting program: /home/daichenghui/c/sample.o
warning: no loadable sections found in added symbol-file system-supplied DSO at 0x7ffff7ffa000
main

Breakpoint 1, test (size=4) at sample.c:4
4        size = size + 2;
(gdb)    //一步一步的调试
5        return size;
(gdb) s
6    }
(gdb) s
main (argc=1, argv=0x7fffffffe0e8) at sample.c:14
14      printf("last:%d\n", last);
(gdb) s
last:6
15    }
(gdb) s
0x00007ffff7a3c76d in __libc_start_main () from /lib/x86_64-linux-gnu/libc.so.6
(gdb) s
Single stepping until exit from function __libc_start_main,
which has no line number information.
[Inferior 1 (process 19929) exited with code 07]
(gdb)

命令 解释 示例
file <文件名> 加载被调试的可执行程序文件。
因为一般都在被调试程序所在目录下执行GDB,因而文本名不需要带路径。
(gdb) file gdb-sample
r Run的简写,运行被调试的程序。
如果此前没有下过断点,则执行完整个程序;如果有断点,则程序暂停在第一个可用断点处。
(gdb) r
c Continue的简写,继续执行被调试程序,直至下一个断点或程序结束。 (gdb) c
b <行号>
b <函数名称>
b *<函数名称>
b *<代码地址>

d [编号]

b: Breakpoint的简写,设置断点。两可以使用“行号”“函数名称”“执行地址”等方式指定断点位置。
其中在函数名称前面加“*”符号表示将断点设置在“由编译器生成的prolog代码处”。如果不了解汇编,可以不予理会此用法。

d: Delete breakpoint的简写,删除指定编号的某个断点,或删除所有断点。断点编号从1开始递增。

(gdb) b 8
(gdb) b main
(gdb) b *main
(gdb) b *0x804835c

(gdb) d

s, n s: 执行一行源程序代码,如果此行代码中有函数调用,则进入该函数;
n: 执行一行源程序代码,此行代码中的函数调用也一并执行。

s 相当于其它调试器中的“Step Into (单步跟踪进入)”;
n 相当于其它调试器中的“Step Over (单步跟踪)”。

这两个命令必须在有源代码调试信息的情况下才可以使用(GCC编译时使用“-g”参数)。

(gdb) s
(gdb) n
si, ni si命令类似于s命令,ni命令类似于n命令。所不同的是,这两个命令(si/ni)所针对的是汇编指令,而s/n针对的是源代码。 (gdb) si
(gdb) ni
p <变量名称> Print的简写,显示指定变量(临时变量或全局变量)的值。 (gdb) p i
(gdb) p nGlobalVar
display ...

undisplay <编号>

display,设置程序中断后欲显示的数据及其格式。
例如,如果希望每次程序中断后可以看到即将被执行的下一条汇编指令,可以使用命令
“display /i $pc”
其中 $pc 代表当前汇编指令,/i 表示以十六进行显示。当需要关心汇编代码时,此命令相当有用。

undispaly,取消先前的display设置,编号从1开始递增。

(gdb) display /i $pc

(gdb) undisplay 1

i Info的简写,用于显示各类信息,详情请查阅“help i”。 (gdb) i r
q Quit的简写,退出GDB调试环境。 (gdb) q
help [命令名称] GDB帮助命令,提供对GDB名种命令的解释说明。
如果指定了“命令名称”参数,则显示该命令的详细说明;如果没有指定参数,则分类显示所有GDB命令,供用户进一步浏览和查询。
(gdb) help display

 

 

 

1. attach: 用gdb调试一个正在运行中的进程
gdb <program> PID

 

2. br: 设置断点
br filename:line_num

 

br namespace::classname::func_name

 

3. n: 单步跳过   s: 单步进入

 

4. finish:执行到函数retun返回

 

5. list: 列出当前位置之后的10行代码;list line_number: 列出line_number之后的十行代码

 

6. bt(backtrace):列出调用栈

 

7. info locals:列出当前函数的局部变量

 

8. p var_:打印变量值

 

9. info breakpoints:列出所有断点

 

10. delete breakpoints:删除所有断点;delete breakpoints id:删除编号为id的断点;disable/enable breakpoints id:禁用/启用断点

 

11. break ... if ... 条件中断

 

 

 

C++中用GDB调试的注意事项:

 

1. 函数断点的结构是namespace::ClassName::funcName

 

(gdb) b oceanbase::mergeserver::ObMsSqlScanEvent::process_result
Breakpoint 1 at 0x435c0a: file ob_ms_sql_scan_event.cpp, line 533.

 

 

 

还有一个小问题,网上很少提到:被调试的程序必须和源码放在同一台机器上,才能用list命令列出源码,否则提示找不到。

 

posted @ 2015-04-29 21:52  牧 天  阅读(855)  评论(0)    收藏  举报