🌒

Stack Pub

GDB的常用调试手段

GDB是一个由GNU开源组织发布的、UNIX/LINUX操作系统下的、基于命令行的、功能强大的程序调试工具。 对于一名Linux下工作的c/c++程序员,gdb是必不可少的工具。

生出调试信息

gcc -g hello.c -o hello

coredump配置

  1. 建立储存coredump文件的文件夹: mkdir ~/corefile
  2. 查看,设置coredump文件大小: ulimit -a ulimit -c unlimited
  3. 执行以下两条命令:
    1. echo "1" > /proc/sys/kernel/core_uses_pid // 将1写入到该文件里
    2. echo "/corefile/core-%e-%p-%t" > /proc/sys/kernel/core_pattern
  4. 修改配置文件/etc/profile
    1. 修改ulimit -S -c 0 > /dev/null 2>&1ulimit -S -c unlimited > /dev/null 2>&1 。没有则直接添加。
    2. 执行命令生效该文件:source /etc/profile
  5. 检查配置是否生效: kill -s SIGSEGV $$

启动gdb调试的方法

$gdb <program>
$gdb <program> <core dump file> /* core文件 */
$gdb <program> <pid>  /* 运行中程序的进程号  */

程序运行上下文

运行参数设置

  1. set args可以指定运行时参数(gdb a.out set args 10 20).
  2. show args 查看设置好的运行参数.
  3. 不指定运行参数运行run(r).
  4. 指定运行参数r 1 2 30.

显示源代码

  1. list
  2. list "文件名.后缀名":行号(显示别的文件)
  3. show listsize
  4. set listsize count
  5. search text:该命令可显示在当前文件中包含text串的下一行。
  6. reverse-search text:该命令可以显示包含text 的前一行。

设置断点

  1. break 设置断点,可以简写为b.
  2. b 10设置断点,在源程序第10行.
  3. b func设置断点,在func函数入口处.

条件断点

break args if (condition) ()可选。

break main if argc > 1
break if (i == 7000)
break test.c:34 if (x & y) == 1

多文件断点

break filename:linenum

查询断点

info b

观察点

  1. watch 为表达式(变量)expr设置一个观察点。当表达式值有变化时,马上停住程序。
  2. rwatch表达式(变量)expr被读时,停住程序。
  3. awatch 表达式(变量)的值被读或被写时,停住程序。
  4. info watchpoints列出当前所设置了的所有观察点。

维护断点

  1. delete 断点号n:删除第n个断点
  2. disable 断点号n:暂停第n个断点
  3. enable 断点号n:开启第n个断点
  4. clear 行号n:清除第n行的断点
  5. delete breakpoints:清除所有断点

调试代码

运行程序

  1. run 运行程序,可简写为r
  2. next 单步跟踪,函数调用当作一条简单语句执行,可简写为n
  3. step 单步跟踪,函数调进入被调用函数体内,可简写为s
  4. finish 退出函数
  5. until 在一个循环体内单步跟踪时,这个命令可以运行程序直到退出循环体,可简写为u。
  6. continue 继续运行程序,可简写为c
  7. info program 来查看程序的是否在运行,进程号,被暂停的原因。
  8. quit:简记为 q ,退出gdb

打印表达式

print 打印变量、字符串、表达式等的值,可简写为p。

print h@10 数组首地址@数组长度。

查看运行信息

  1. whatis 命令可以显示某个变量的类型
  2. where/bt :当前运行的堆栈列表;
  3. frame
  4. info program: 来查看程序的是否在运行,进程号,被暂停的原因。

窗口

  1. Ctrl+x+a
  2. (focus)fs next在src和cmd之间切换外,还可以使用fs src切换到src,和fs cmd切换到cmd
  3. layout:用于分割窗口,可以一边查看代码,一边测试:
  4. layout src:显示源代码窗口
  5. layout asm:显示反汇编窗口
  6. layout regs:显示源代码/反汇编和CPU寄存器窗口
  7. layout split:显示源代码和反汇编窗口
  8. Ctrl + L:刷新窗口

— Nov 12, 2019

GitHub RSS