GDB调试命令使用心得
1、程序运行参数。
可指定运行时参数。(如:set args 10 20 30 40 50)
set args
命令可以查看设置好的运行参数
show args
2、 运行环境。
path <dir> #可设定程序的运行路径。
show paths #查看程序的运行路径。
set environment varname [=value] #设置环境变量。如:set env USER=hchen
show environment [varname] #查看环境变量。
3、工作目录。
cd <dir> #相当于shell的cd命令。
pwd #显示当前的所在目录。
dir <src_path> #设置源码目录
4、调试
显示别的文件:l “文件名.后缀名”:行号 (双引号不能少)
在别文件打断点:b “文件名.后缀名”:行号
gdb -q exe #表示不打印gdb版本信息,界面较为干净;
命令 l r(运行) b c(continue) s(单步调试) n(next) p q watch(监视变量变化)
gdb attach 进程pid #(附加进程调试,附加进去之后,使用命令c)
5、查看core和堆栈
gdb -c core文件 #core文件对应的可执行程序
set solib-search-path [DIR] #设置加载动态库的路径,堆栈在动态库的时候需要设置
bt #查看堆栈
thread apply all bt #查看所有线程堆栈
6、开启core
#只能root用户执行,sudo无效
ulimit -a
ulimit -c unlimited
echo "/home/leagsoft/SafeDataExchange/Log/core-%e-%p-%t" > /proc/sys/kernel/core_pattern
echo "1" > /proc/sys/fs/suid_dumpable
source /etc/profile
#关闭core生成
ulimit -c 0
7、判断程序是否带-g编译
readelf --debug-dump=decodedline libblowsnow.so
提示:mac系统lldb调试,可以平替gdb
8、gdb打印相关命令
p/t variable_name 以二进制打印变量
p/t variable_addr 以二进制打印地址内容
p/a 能够以指针的方式输出变量
使用 set output-radix 16 修改print操作默认输出格式为16进制,使用 set output-radix 10 将输出格式调回默认的10进制。
display 的用法与 print 的用法相似,但是 display 会在每次步进执行后输出该变量。这个功能与Visual Studio中的Watch功能比较类似。在不想观察该变量时,使用 undisplay 命令可以取消
使用 x 命令可以将指定内存地址中的内容打印出来。
简要的命令语法如下:
x/nfu
n 用于指定打印的数量
f 用于指定打印的格式
u 用于指定每个打印变量的长度:b(byte)一个字节,h(half-word)两个字节,w(word)四个字节,g(giant word)八个字节
打印字符无限制
set print elements 0
可以让gdb打印变量一行一行的显示,而不是一堆
set print pretty on
只运行当前线程
set scheduler-locking on
打印vector元素
p *(vt._M_impl._M_start)@1
vt, 容器名字
1,第几个元素,从1开始
打印map元素
Pmap val_name type type
9、gdb调试循环
for(i = 0;i < 100; i++)
watich i #监视i变量
info b #查看i是第几个变量。假设是第n个断点
#假设我想查看低70次循环
ignore n 70 #设置忽略对i的70次监视
c #跳转至第70次循环
gdb屏蔽信号handle SIGUSR1 nostop
10、gdb后台调试
用gdb --command=filename命令,将gdb调试命令预先存储在filename命令中。
b main
c
bt
q
#然后启动
nohup gdb -p pid --command=filename &
11、gdb如何在程序崩溃时将堆栈信息保留
#线一直attach进程,提前设置好处理的命令。
handle SIGPIPE nostop noprint
handle SIGSEGV stop
handle SIGABRT stop
c
set logging file ./gdb_bt.txt
set logging on
thread apply all bt
set logging off
c
#这样在崩溃时就会将堆栈打到文件里面
发现编译出来的文件无法调试,使用其他版本的编译 -gdwarf-3 -gdwarf-1 -gdwarf-2 -gdwarf-4