对于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