Linux编译调试相关命令

记录Linux编译调试相关命令的参数

gcc/g++编译

gcc/g++执行编译需要四步:

  1. 预处理,后缀为.i
  2. 编译,后缀为.s
  3. 汇编,后缀.o
  4. 链接

常用参数

  • -c只执行预处理编译汇编,生成.o文件
  • -C在预处理时不删除注释
  • -E只执行预处理
  • -S只执行预处理编译,生成.s文件
  • -o指定目标名称,如果缺省并执行了链接则会为a.out
  • -M生成文件关联的信息,-MM生成的关联信息忽略#include<file>的依赖
  • -O0-O1-O2-O3编译器的优化等级,-O0表示没有优化,-O1为缺省值,-O3优化级别最高
  • -g 指示编译器,在编译的时候,产生调试信息。
  • -v打印执行信息
  • -m32/-m64生成32/64位程序
  • -masm=attAT&T格式汇编、-masm=intelIntel格式汇编

GDB

Layout命令

命令 功能
layout src 显示源码窗口
layout asm 显示汇编窗口
layout split 显示源码 & 汇编窗口
layout regs 显示汇编 & 寄存器窗口
layout next 下一个layout
layout prev 上一个layout
C-x 1 单窗口模式
C-x 2 双窗口模式
C-x a 回到传统模式

跳转命令

命令 功能
start 开始启动程序,并停在main第一句等待命令
step 执行下一行语句, 如语句为函数调用, 进入函数中
next 执行下一行语句, 如语句为函数调用, 不进入函数中
finish 连续运行到当前函数返回为止
continue 从当前位置继续运行程序
return 强制令当前函数返回
call func() 强制调用函数, 也可以用print func()
run 从头开始运行程序
quit 退出程序
until 运行程序直到退出循环体; / until+行号: 运行至某行

调试输出命令

命令 功能
print 输出变量值 & 调用函数 & 通过表达式改变变量值
info var 查看全局 & 静态变量
info locals 查看当前函数局部变量
list 查看当前位置代码
backtrace 查看各级堆栈的函数调用及参数
set var 变量=xx 将变量赋值为xx

断点

命令 功能 简写
break N_LINE 在第N_LINE行上设置断点 b n
b func 在func函数上设置端点
delete breakpoints 删除断点
disable breakpoints 禁用断点
enable 断点号 启动端点
info breakpoints 查看断点列表 info b
break foo if x>0 设置条件断点
clear n 清除第n行的断点

观察点

当待观察点被读 或 被写时,程序停下来,并输出相关信息

命令 功能
watch 设置写观察点
rwatch 设置读观察点
awatch 设置读写观察点
info watchpoints 查看观察点列表

Display跟踪点

命令 功能
display var 每次停下来时,显示设置的变量var的值
undisplay 取消跟踪显示
info display 设置读写观察点
info watchpoints 查看跟踪列表

运行信息

where/bt :当前运行的堆栈列表
set args 参数:指定运行时的参数
show args:查看设置好的参数
info program: 来查看程序的是否在运行,进程号,被暂停的原因

TUI

Text User Interface
开启方式:

  1. gdb启动时添加-tui参数
  2. 在gdb命令行执行tui enable
    Ctrl + n,下一命令(Next)
    Ctrl + p,上一命令(Prev)

QEMU

进入退出monitor

C-a c在console和monitor模式切换。其他命令如下:

前缀 指令
Ctrl+a h help
Ctrl+a x 退出QEMU
Ctrl+a c 虚拟机和QEMU控制台切换
  • 地址类
    i /fmt addr – I/O port read
    o /fmt addr value – I/O port write
    x /fmt addr – virtual memory dump starting at ‘addr’
    xp /fmt addr – physical memory dump starting at ‘addr’
    print|p /fmt expr – print expression value (use $reg for CPU register access)

  • 查询
    info [subcommand] – show various information about the system state

  • 控制
    system_powerdown – send system power down event
    system_reset – reset the system
    system_wakeup – wakeup guest from suspend