Linux调试-GDB

启动GDB调试

在使用GDB之前,编译出带调试信息的程序,调试信息中包含了函数和变量所在文件和行号信息,通过gcc编译出debug版本 -g:
gcc -g test.c -o test

调试方式1 : 运行GDB程序并加载程序执行

(1) 可以用 gdb test 的方式,test为可执行程序名
[root ] # gdb test
(2) 也可以先启动 gdb , 然后用 file <文件名> 命令加载可执行文件
gdb
(gdb) file test

调试方式2 : 对正在运行的程序进行调试

[root ]# ps -a 查看待调试程序的进程ID号
[root ]# gdb att pid

调试常用命令
  • 1、 b : 下断点

  • 2、 X : 查看内存
    X/nfu Address
    注:
    n:显示多少个单元
    fo(octal 8进制),x(hex 16进制),d(decimal 10进制)
    u:指定要打印的内容的长度; b(Byte 1个字节),w(word 4个字节)
    例如:
    X/8xb szArry : 显示数组内容

  • 3、 p:查看
    (1) p a
    (2) 修改 :p a=12345
    (3) 查看堆栈地址内容 : p *((int *)(0x7ffffffr4ac))
    (4) 函数调用 : p Print_Hello

  • 4、 thread:线程
    (1) 查看 : info threads
    (2) 切换线程 : thread XXX
    (3) thread num 显示线程情况,num为线程号

  • 5、 r:run的简写,运行被调试的程序

  • 6、 bt : backtrace的简写,查看堆栈(调用栈)的信息

  • 7、 watch
    watch :为表达式(变量)expr设置一个观察点;变量或表达式值有变化时,马上停住程序。

    • 表达式可以是一个变量
      例如:watch value_a
    • 表达式可以是一个地址:
      例如:watch *(int *)0x12345678 可以检测4个字节的内存是否变化。
    • 表达式可以是一个复杂的语句表达式:
      例如:watch a*b + c/d

    info watchpoints: 列出当前设置的所有观察点

core文件

gdb /xxx/xxx xxx.core
bt
通过上面的命令调试.core文件,可以看出是哪个函数中出错



1. gdb的调用堆栈详解: bt

调用堆栈是当前函数之前的所有调用函数的列表(包括当前函数),每个函数及其变量都被分配了个栈帧,最近调用的函数(也就是当前函数)在0号栈帧中(栈底帧),外层的调用函数的栈帧号依次+1
gdb通过命令bt(backtrace回溯)来打印堆栈

(gdb) bt
#0
#1
#2
2. 命令 frame args

参数args表示编号numAddress,将当前栈帧设置为args指定的栈帧,并打印该栈帧的简要信息
例如:

#切换到1号栈帧,并打印1号帧的内容
(gdb) frame 1
(gdb) info locals
3. 命令up/down

在当前栈帧向上回退/向下前进(更外层/更内层,即远离0号/靠近0号)n个栈帧,n默认为1

4. 打印栈帧信息
4.1 命令 frame

打印当前栈帧的简要信息

4.2 命令 info frame

打印当前栈帧的详细信息

4.3 命令 info frame args

打印指定栈帧的详细信息

4.4 命令 info args

打印当前栈帧函数参数信息

4.5 命令 info locals

打印当前帧中的局部变量的信息,缺省情况下当前帧就是被中断的函数,也就是0号栈帧的函数

你可能感兴趣的:(Linux调试-GDB)