Skip to content

Latest commit

 

History

History
247 lines (161 loc) · 3.63 KB

GDB笔记.md

File metadata and controls

247 lines (161 loc) · 3.63 KB

GDB笔记

安装

对于Debian系统,可以使用apt一件安装

编译配置

对于需要使用gdb进行调试的程序,需要在编译时增加编译参数,以下使用cmake文件的配置为例

cmake_minimum_required(VERSION 3.10)

project(Test)

# -DUSE_DEBUG=ON
option(USE_DEBUG "Enable debug mode" OFF)

# ...

add_executable(xxx xxx_test.c ${SOURCE})

if(USE_DEBUG)
	# 开启调试信息,该配置会为可执行程序在编译时增加-g参数
    set(CMAKE_BUILD_TYPE Debug)
    # 启用完整的调试信息 -g3 保留宏和源文件中的所有符号信息 -gdwarf-2 或 -gdwarf-4
    ## set(CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} -g3 -gdwarf-4")
    # 添加宏定义 DEBUG,这个宏可以在代码种使用,以便输出一些调试信息
    target_compile_definitions(xxx PRIVATE DEBUG)
endif()

# ...

并不是只有增加了-g参数的可执行程序才能被gdb调试,而是增加了-g参数就可以通过gdb获得更多调试信息,方便调试

运行

执行

若可执行程序没有主函数传参,可以使用gdb中的run命令直接运行

(gdb) run

如存在主函数传参,则需要使用set args [param1] [param2] ...的方式进行传参

(gdb) set args param1 param2 ...

再进行启动

(gdb) run

运行控制

执行到断点/结束

(gdb) continue

步入(进入函数)

(gdb) step

单步执行(不跳入函数)

(gdb) next

查看当前上下文(代码)

(gdb) list

断点

使用break命令在gdb控制台中为可执行程序添加断点

为函数添加断点

(gdb) break <func name>
# (gdb) break main

在特定行添加断点

(gdb) break <c file name>.c:<line count>
# (gdb) break xxx.c:10

条件断点

(gdb) break <c file name>.c:<line count> if <var name> == <var value>
# (gdb) break xxx.c:10 if i == 5

移除断点

要移除特定的断点,首先需要知道断点的编号。

(gdb) info break<breakpoints>

移除断点

(gdb) delete <breakpoint num>

移除所有断点

(gdb) delete

启用/禁用断点

相比于直接移除断点,还可以禁用断点,这种方式更加灵活。

(gdb) info break<breakpoints>
(gdb) disable <breakpoint num>
(gdb) enable <breakpoint num>

禁用所有断点

(gdb) disable

启用所有断点

(gdb) enable

查看变量

查看函数中的临时变量

info locals

查看函数的传入参数

info args

打印变量的值

(gdb) print myVar

打印复杂数据结构

(gdb) print *someStruct

修改变量的值

(gdb) set var myVar=4

监控变量

在某个变量的作用域中设置监控变量

(gdb) watch <var name>

或者监控表达式

(gdb) watch Struct.member

查看所有监控点

(gdb) info watchpoints

与移除断点一样,可以移除监控点

查看线程

列出所有线程

(gdb) info threads

切换到特定线程

(gdb) thread <thread ID>

查看内存

查看当前函数调用栈

(gdb) bt

查看特定帧

(gdb) frame 1

查看内存内容

(gdb) x/16xb 0xADDRESS

这里x表示“检查内存”,16表示要显示16个单元,x表示按十六进制显示,b表示每个单元是一个字节。0xADDRESS需要替换为实际的内存地址。

退出

(gdb) quit