Linux下GDB调试简单示例

这里介绍对文件first.c的基本GDB调试操作,只有部分命令,只是一个示例,运行环境为装有gcc编译器和gdb调试器的Linux环境,基本GDB调试命令如下表:

命令 描述

backtrace(或bt) 查看各级函数调用及参数

finish 连续运行到当前函数返回为止,然后停下来等待命令

frame(或f) 帧编号 选择栈帧

info(或i) locals 查看当前栈帧局部变量的值

list(或l) 列出源代码,接着上次的位置往下列,每次列10行

list 行号 列出从第几行开始的源代码

list 函数名 列出某个函数的源代码

next(或n) 执行下一行语句

print(或p) 打印表达式的值,通过表达式可以修改变量的值或者调用函数

set var 修改变量的值

start 开始执行程序,停在main函数第一行语句前面等待命令

step(或s) 执行下一行语句,单步调试用这个

x 查看变量内存

b 后面加行号表示在该行打断点

c 继续运行到下一个断点

r 运行

quit 退出调试

vi 后面加文件名可以打开文件用vim进行编辑

disass (/m) main 查看main函数的汇编

以下是示例的全过程:

[LLL@localhost LLL]$ cd test //到目标目录
[LLL@localhost test]$ ls
first.c server.c sock.c
[LLL@localhost test]$ cat first.c //查看first.c内容
#include <stdio.h>

int add(int m, int n)
{
int result;
m = 10*m;
n = 100*n;
result = m+n;
return result;
}

int main()
{
int a = 10;
int b = 100;
int i = 0;
printf("%d",i);
i = add(a,b);
b = add(b,a);
printf("%d %d %d",a,b,i);
return 0;
}
[LLL@localhost test]$ gcc -g first.c -o first //gcc 编译
[LLL@localhost test]$ ls
first first.c server.c sock.c
[LLL@localhost test]$ ./first //运行目标文件
010 2000 10100[LLL@localhost test]$ ls
first first.c server.c sock.c
[LLL@localhost test]$ vi first.c //由于运行看出没有换行,因此用vim编辑修改,打印中加入了换行
[LLL@localhost test]$ rm -f first
[LLL@localhost test]$ ls
first.c server.c sock.c
[LLL@localhost test]$ gcc -g first.c -o first
[LLL@localhost test]$ ./first //换行后的结果
0
10 2000 10100
[LLL@localhost test]$ gdb first //启动GDB调试
GNU gdb (GDB) Red Hat Enterprise Linux 7.6.1-100.el7
Copyright (C) 2013 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-redhat-linux-gnu".
For bug reporting instructions, please see:
<http://www.gnu.org/software/gdb/bugs/>...
Reading symbols from /data/ManyCore/software/LLL/test/first...done.
(gdb) l //列出内容
5       int result;
6       m = 10*m;
7       n = 100*n;
8       result = m+n;
9       return result;
10      }
11      
12      int main()
13      {
14      int a = 10;
(gdb) //Enter翻页
15      int b = 100;
16      int i = 0;
17      printf("%d\n",i);
18      i = add(a,b);
19      b = add(b,a);
20      printf("%d %d %d\n",a,b,i);
21      return 0;
22      }
(gdb) b 17 //在17行打断点
Breakpoint 1 at 0x40057c: file first.c, line 17.
(gdb) start //开始运行程序
Temporary breakpoint 2 at 0x400567: file first.c, line 14.
Starting program: /data/ManyCore/software/LLL/test/first 
[Thread debugging using libthread_db enabled]
Using host libthread_db library "/lib64/libthread_db.so.1".

Temporary breakpoint 2, main () at first.c:14
14      int a = 10; //进入main函数的首行
Missing separate debuginfos, use: debuginfo-install glibc-2.17-196.el7_4.2.x86_64
(gdb) n //下一步,遇到子函数不进入,当做一行执行
15      int b = 100;
(gdb) s //下一步,s可以进入子函数
16      int i = 0;
(gdb) s

Breakpoint 1, main () at first.c:17
17      printf("%d\n",i);
(gdb) s
0
18      i = add(a,b);
(gdb) b 6 //在6行打断点
Breakpoint 3 at 0x400537: file first.c, line 6.
(gdb) c //运行到下一个断点
Continuing.

Breakpoint 3, add (m=10, n=100) at first.c:6
6       m = 10*m;
(gdb) c
Continuing.

Breakpoint 3, add (m=100, n=10) at first.c:6
6       m = 10*m;
(gdb) i locals //查看当栈帧中的局部变量(这里的add函数)
result = 10100 
(gdb) s
7       n = 100*n;
(gdb) s
8       result = m+n;
(gdb) s
9       return result;
(gdb) s
10      }
(gdb) s
main () at first.c:20
20      printf("%d %d %d\n",a,b,i);
(gdb) i locals //查看当栈帧中的局部变量(这里的main函数)
a = 10
b = 2000
i = 10100
(gdb) p a //查看变量
$1 = 10
(gdb) p b
$2 = 2000
(gdb) p &a //查看变量的地址
$3 = (int *) 0x7fffffffe3cc
(gdb) x 0x7ffffffe3cc
0x7ffffffe3cc:  Cannot access memory at address 0x7ffffffe3cc
(gdb) x 0x7fffffffe3cc //查看内存的值
0x7fffffffe3cc: 0x0000000a
(gdb) r //运行程序
The program being debugged has been started already.
Start it from the beginning? (y or n) y
Starting program: /data/ManyCore/software/LLL/test/first 
[Thread debugging using libthread_db enabled]
Using host libthread_db library "/lib64/libthread_db.so.1".

Breakpoint 1, main () at first.c:17
17      printf("%d\n",i);
(gdb) c
Continuing.
0

Breakpoint 3, add (m=10, n=100) at first.c:6
6       m = 10*m;
(gdb) c
Continuing.

Breakpoint 3, add (m=100, n=10) at first.c:6
6       m = 10*m;
(gdb) c
Continuing.
10 2000 10100
[Inferior 1 (process 118146) exited normally]
(gdb)