gdb初步窥探

本文是通过学习左耳朵皓帝的文章,详见:http://blog.csdn.net/haoel

1.使用gdb

gdb主要是用来调试c和c++程序,首先在编译前我们先把调试信息加到可执行程序当中,使用参数 -g 可以实现这一点。

dzhwen@deng:~/first$ gcc -g tst.c -o tst
dzhwen@deng:~/first$ g++ -g tst.cpp -o tst

 

2.启动gdb

1.我们一般使用:gdb + 程序名字来启动gdb。

dzhwen@deng:~/first$ gdb tst

当然也不乏其他方法:

2、gdb <program> core
       用gdb同时调试一个运行程序和core文件,core是程序非法执行后core dump后产生的文件。

3、gdb <program> <PID>
       如果你的程序是一个服务程序,那么你可以指定这个服务程序运行时的进程ID。gdb会自动attach上去,并调试他。program应该在PATH环境变量中搜索得到。

 

3.常见的gdb

1.help : 查看常见的命令帮助

(gdb) help
List of classes of commands:

aliases -- Aliases of other commands
breakpoints -- Making program stop at certain points
data -- Examining data
files -- Specifying and examining files
internals -- Maintenance commands
obscure -- Obscure features
running -- Running the program
stack -- Examining the stack
status -- Status inquiries
support -- Support facilities
tracepoints -- Tracing of program execution without stopping the program
user-defined -- User-defined commands

Type "help" followed by a class name for a list of commands in that class.
Type "help all" for the list of all commands.
Type "help" followed by command name for full documentation.
Type "apropos word" to search for commands related to "word".
Command name abbreviations are allowed if unambiguous.

 

2.list,简写l:列出源码

(gdb) list
7        {
8            sum += i;
9        }
10        return sum;
11    }
12    
13    int main()
14    {
15        int i;
16        long result = 0;

 

3.回车:重复上一次的命令

(gdb) 
17        for(i = 1;i <= 100;++i)
18        {
19            result += i;
20        }
21    
22        printf("result[1-100] = %ld\n",result);
23        printf("result[1-250] = %d\n",func(250));
24        return 0;
25    }
26    

 

4.break + 数字  或者  break + 函数名 —— 设置断点

(gdb) break 15
Breakpoint 1 at 0x804841a: file tst.c, line 15.
(gdb) break func
Breakpoint 2 at 0x80483ea: file tst.c, line 5.

 

5.info + 信息 —— 查看各种信息

(gdb) info break —— 查看断点信息
Num     Type           Disp Enb Address    What
1       breakpoint     keep y   0x0804841a in main at tst.c:15
2       breakpoint     keep y   0x080483ea in func at tst.c:5

 

6.run(简写r)—— 运行程序,遇到断点自动中断。

(gdb) run
Starting program: /home/dzhwen/first/tst 

Breakpoint 1, main () at tst.c:16
16        long result = 0;

 

7.next(简写n) —— 单条语句执行。

(gdb) next
17        for(i = 1;i <= 100;++i)

 

8.continue —— 继续执行(直到下一个断点中止)

(gdb) continue
Continuing.
result[1-100] = 5050

Breakpoint 2, func (n=250) at tst.c:5
5        int sum = 0,i;

 

9.print(简写p) + 变量名 —— 打印变量的值,print命令简写。

 

(gdb) p sum
$1 = 0
(gdb) n
6        for(i = 0;i < n;++i)
(gdb) p i
$2 = 1

 

 

10,bt —— 查看程序堆栈(包括main函数和其他调用的函数)

(gdb) bt
#0  func (n=250) at tst.c:6
#1  0x08048461 in main () at tst.c:23

 

11.finish —— 运行至函数退出

(gdb) finish
Run till exit from #0  func (n=250) at tst.c:6
0x08048461 in main () at tst.c:23
23        printf("result[1-250] = %d\n",func(250));
Value returned is $7 = 31125

 

12.quit(简写q) —— 退出gdb

(gdb) quit

 

gdb初步就这些了吧,多多指教!

 

 

 

posted @ 2014-05-27 22:26  中大黑熊  阅读(302)  评论(0编辑  收藏  举报