点击蓝字,关注我们
01
概念
GDB是一个由GNU开源组织发布的、UNIX/LINUX操作系统下的、基于命令行的、功能强大的程序调试工具。
在实际应用中,有两种调试方法:在线调试和离线调试。
离线调试适用于开发测试环境,可以自由启停进程,设置断点;在线调试一般用于现场问题分析,不能随便启停进程,对于技术要求较高。
02
前提条件
2.1 编译
若想执行gdb调试,在Makefile文件中需要增加编译调试选项-g,例如:
gdb dup_file.c –o dum_file_elf –g –lpthread
说明:-g选项的作用是在可执行文件(ELF)中加入源代码的相关信息,比如ELF中第几条机器指令对应源代码的行数。但不是把整个源文件嵌入到可执行文件中,所以在调试时必须保证gdb能找到源文件。
-g完整格式是-glevel,其中,level中指定了调试信息中包含了调试信息的多少,默认的是2,level=1最少,level=3最多。
2.2 readelf查看段信息
例如:
readelf -S helloWorld|grep debug
注:helloWorld为文件名,如果没有任何debug信息,则不能被调试。
2.3 file查看strip状况
下面的情况也是不可调试的:
file helloWorld
helloWorld: (省略前面内容) stripped
注:如果最后是stripped,则说明该文件的符号表信息和调试信息已被去除,不能使用gdb调试。但是not stripped的情况并不能说明能够被调试。
03
使用方法
3.1 启动调试
在开发中可以将源码和可执行文件拷贝到某一目录下,使用gdb启动进程进行调试,也可以不拷贝源码和可执行文件,使用NFS挂载到编译环境执行调试;在现场环境中使用ps获取进程的pid,然后gdb –p pid执行在线调试。
离线调试:
gdb 进程名
gdb –tui 进程名
在线调试:
ps –A | grep 进程名
gdb –p pid/gdb attach pid
说明:使用-tui参数可以将调试窗口分为两部分:上面是源码,下面是调试信息,使用Ctrl+n/Ctrl+p或者方向键进行翻页。
带参数调试:
1、启动的时候带上参数
gdb --args xxx 参