GDB调试命令小结
1.启动调试
前置条件:编译生成执行码时带上 -g,如果使用Makefile,通过给CFLAGS指定-g选项,否则调试时没有符号信息。
gdb program //最常用的用gdb启动程序,开始调试的方式
gdb program core //用gdb查看core dump文件,跟踪程序core的原因
gdb program pid //用gdb调试已经开始运行的程序,指定pid即可
gdb attach pid //用gdb调试已经开始运行的程序,指定pid即可
2.调试命令
(1)执行命令模式
-batch选项。
比如:打印$pid进程所有线程的堆栈并退出。
gdb -ex "set pagination 0" -ex "thread apply all bt" -batch -p $pid
(2).交互模式
run //运行程序
continue //中断后继续运行到下一个断点
step //单步执行,进入函数
next //单步执行
return //函数未执行完,忽略未执行的语句,返回。
finish //函数执行完毕返回。
call //调用某一个函数 fun("1234")
(backtrace)bt //显示栈桢
bt N //显示开头N个栈桢
bt -N //显示最后N个栈桢
(frame)f N //显示第N层栈桢
list //显示源码
set directory //设置gdb的工作目录
pwd //当前的工作目录
(3)反复执行
continue N //连续执行cointiue N次,一般用于避免频繁断点
step N
next N
3.断点
break 函数名 //设置断在某个函数
break 文件名:行号 //设置断在某一行
info break //查看设置的断点信息
break if condition //条件断点
break 函数名 thread 线程号 //设置断点只断某个线程,通过info threads 查看线程号
delete 断点号 断点号... //删除一个或多个断点
diable 断点号 断点号... //禁止一个或多个断点
enable 断点号 断点号... //打开一个或多个断点
command 断点号 //断点触发时,执行命令,一般用于打印变量
(gdb) command 1
Type commands for breakpoint(s) 1, one per line.
End with a line saying just "end".
>print x
>end
(gdb)
4.检测点
watch //为表达式(变量)expr设置一个观察点。一量表达式值有变化时,马上停住程序。
rwatch //当表达式(变量)expr被读时,停住程序。
awatch //当表达式(变量)的值被读或被写时,停住程序。
info watchpoints //列出当前所设置了的所有观察点。
经验:观察某个变量是否变化,被读或者被写,由于变量只在某一个作用域,可以获取变量的地址,然后观察。
比如:观察examined_rows变量神马时候被修改
(1).p &examined_rows,得到地址
(2).watch *(ha_rows *) 0x7ffec8005e28,则可以观察这个变量的变化情况。
5.查看变量
(1)设置
set print elements N //指定打印的长度,对长字符串特别有用。
set print element 0 //输出完整的字符串
set print pretty //设置GDB打印结构的时候,每行一个成员,并且有相应的缩进,缺省是关闭的
print {type} variable
比如:
(gdb) p {ABC} 0x7fffffffe710
$2 = {val = 1.5, val2 = 10}
print xxx //打印变量
p /x xxx //16进制显示
p str@str_len //打印字符串
info locals //打印出当前函数中所有局部变量及其值。
info args //打印出当前函数的参数名及其值。
display 变量 //自动打印变量
undisplay //取消自动打印
注意:默认编译的时候,调试过程是看不见宏的值的,编译时候需要给选项。-g3
6.内存查看
格式: x /nfu <addr> x 是 examine 的缩写
a.n表示要显示的内存单元的个数
b.f表示显示方式, 可取如下值
(1).x 按十六进制格式显示变量。
(2).d 按十进制格式显示变量。
(3).u 按十进制格式显示无符号整型。
(4).o 按八进制格式显示变量。
(5).t 按二进制格式显示变量。
(6).a 按十六进制格式显示变量。
(7).i 指令地址格式
(8).c 按字符格式显示变量。
(9).f 按浮点数格式显示变量。
c.u表示一个地址单元的长度
(1).b表示单字节,
(2).h表示双字节,
(3).w表示四字节,
(4).g表示八字节
比如:x/3xh buf
表示从内存地址buf读取内容,3表示三个单位,x表示按十六进制显示,h表示以双字节为一个单位。
7.多线程调试
info threads //查看线程
thread thread_no //切换到线程号
thread apply all command //所有线程都执行命令打印栈桢
比如:thread apply all bt //所有线程都打印栈桢
(1)线程锁
show scheduler-locking
set scheduler-locking on
set scheduler-locking off
默认是off,当程序继续运行的时候如果有断点,那么就把所有的线程都停下来,直到你指定某个线程继续执行(thread thread_no apply continue).
但是如果直接在当前线程执行continue的话,默认是会启动所有线程。这种模式有一种副作用,如果多个线程都断在同一个函数,这时候调试会出问题。
这个时候需要打开线程锁,但打开线程锁,意味着其它线程不能运行了。
(2)non-stop模式(7.0以后的版本支持)
set target-async 1
set pagination off
set non-stop on
gdb启动了不停模式,除了断点有关的线程会被停下来,其他线程会执行。
8.信号量
(1).singal 发送信号
假定你的程序已将一个专用的 SIGINT(键盘输入,或CTRL-C;信号2)信号处理程序设置成采取某个清理动作,
要想测试该信号处理程序,你可以设置一个断点并使用如下命令:
(gdb) signal 2
(2).handle 拦截信号
Handle命令可控制信号的处理,他有两个参数,一个是信号名,另一个是接受到信号时该作什么。几种可能的参数是:
* nostop 接收到信号时,不要将它发送给程序,也不要停止程序。
* stop 接受到信号时停止程序的执行,从而允许程序调试;显示一条表示已接受到信号的消息(禁止使用消息除外)
* print 接受到信号时显示一条消息
* noprint 接受到信号时不要显示消息(而且隐含着不停止程序运行)
* pass 将信号发送给程序,从而允许你的程序去处理它、停止运行或采取别的动作。
* nopass 停止程序运行,但不要将信号发送给程序。
比如:
handle SIGPIPE stop print //截获SIGPIPE信号,程序停止并打印信息
handle SIGUSR1 nostop noprint //忽略SIGUSR1信号
9.生产环境使用GDB场景
内核转储(coredump)
(1).配置产生core文件
前置条件:确保系统配置的core file size足够,一般设置成unlimited
ulimit -c unlimited
配置corefile的参数:
echo 2 > /proc/sys/fs/suid_dumpable [程序中切换用户,也要产生corefile]
mkdir /tmp/corefiles
chmod 777 /tmp/corefiles
echo "/tmp/corefiles/core">/proc/sys/kernel/core_pattern //配置core文件产生的目录为/tmp/corefiles
echo "1" > /proc/sys/kernel/core_uses_pid
kill -sigsegv pid //模拟异常内存访问信号
注意:
a.确保配置的目录有足够的磁盘空间,否则产生core文件可能不完整。
b.对于mysqld而言,要保证正确产生core-file,需要加上--core-file,默认这个参数是不打开的。
c.kill -9 pid 是不能产生core文件的,因为SIGKILL信号不能被捕获。
(2).使用core文件
gdb /usr/mysql/bin/mysqld core.24556
(3).dump已经运行进程的状态信息
gdb attach pid
(gdb) generate-core-file
调试完毕后,通过detach命令退出。
另外,通过gcore pid 命令也可以dump core文件,生成在当前目录下。
(4).打印线程信息
pstack pid
pt-pmp -p pid
pstack和pt-pmp都可以打印线程的信息,但是pt-pmp会对同类堆栈的线程做聚合汇总,相对于pstack功能更强大,显示也更友好。
(5).altert日志
这里主要针对mysqld问题排查,mysqld异常crash后,有时候在alter日志中可以看到最后crash线程的堆栈,但是一般只有函数名或一串二进制地址,无法定位到具体是crash到哪一行,通过addr2line可以解这个问题。
比如:alter日志中记录crash时的地址是0x64bd60,通过如下命令,可以定位到具体是哪一行
addr2line -e /usr/mysql/bin/mysqld 0x64bd60
/home/admin/131_20160715135613566_11155487_code/rpm_workspace/sql/sql_parse.cc:3067
参考文档
https://www.percona.com/blog/2011/08/26/getting-mysql-core-file-on-linux/
GDB调试命令小结的更多相关文章
- 比较全面的gdb调试命令
from:http://blog.csdn.net/xiajun07061225/article/details/8960332 http://blog.csdn.net/cjfeii/article ...
- gdb调试命令的使用及总结
gdb调试命令的使用及总结 gdb是一个在UNIX环境下的命令行调试工具.如果需要使用gdb调试程序,请在gcc时加上-g选项.下面的命令部分是简化版,比如使用l代替list等等. 1.基本命令 命令 ...
- 经典的GDB调试命令,包括查看变量,查看内存
经典的GDB调试命令,包括查看变量,查看内存 在你调试程序时,当程序被停住时,你可以使用print命令(简写命令为p),或是同义命令inspect来查看当前程序的运行数据.print命令的格式是: p ...
- Linux高级调试与优化——gdb调试命令
番外 2019年7月26日至27日,公司邀请<软件调试>和<格蠹汇编——软件调试案例集锦>两本书的作者张银奎老师进行<Linux高级调试与优化>培训,有幸聆听张老师 ...
- 比较全面的gdb调试命令 (转载)
转自http://blog.csdn.net/dadalan/article/details/3758025 用GDB调试程序 GDB是一个强大的命令行调试工具.大家知道命令行的强大就是在于,其可以形 ...
- Linux调试工具strace和gdb常用命令小结
strace和gdb是Linux环境下的两个常用调试工具,这里是个人在使用过程中对这两个工具常用参数的总结,留作日后查看使用. strace调试工具 strace工具用于跟踪进程执行时的系统调用和所接 ...
- 经典的GDB调试命令
在你调试程序时,当程序被停住时,你可以使用print命令(简写命令为p),或是同义命令inspect来查看当前程序的运行数据.print命令的格式是: printprint /是表达式,是你所调试的程 ...
- gcc gdb调试 & 命令行带参 (一) ******
用GDB调试程序 GDB概述———— GDB是GNU开源组织发布的一个强大的UNIX下的程序调试工具.或许,各位比较喜欢那种图形界面方式的,像VC.BCB等IDE的调试,但如果你是在UNIX平台下做软 ...
- Xcode下 gdb 调试命令
Xcode的调试器为用户提供了一个GDB的图形化界面,GDB是GNU组织的开放源代码调试器.您可以在Xcode的图形界面里做任何事情:但是,如果您需要您可以在命令行里使用GDB的命令,且gdb可以在终 ...
随机推荐
- WCF学习之旅—实现支持REST服务端应用(二十三)
在上一篇(WCF学习之旅—实现REST服务(二十二))文章中简单介绍了一下RestFul与WCF支持RestFul所提供的方法,本文讲解一下如何创建一个支持REST的WCF服务端程序. 四.在WCF中 ...
- css3圆环百分比,菜单栏定位导航
前段时间,社区个人中心改版,看了下设计图,当时隐约感觉到有两个地方(圆环百分比,菜单栏定位导航)比较麻烦.设计图大致如下: 首先看圆环百分比,网上的做法大致分两种,一种是用了CSS3中的transfo ...
- 火狐浏览器中event不起作用解决办法--记录(一)
今天遇到了这个问题.IE,谷歌下都没问题,但在FF下却不起作用,很郁闷查了半天,看别人博文写了老长,结果试了要么起作用,但太麻烦,要么不起作用,说了那么多跟没说一样. 其实只要这一句代码就行:e=ar ...
- Anliven - To-Do List
2016 - December Name Type Start Deadline Status Output Comments Last Review SQL必知必会(第4版) Book 2016-1 ...
- 父页面操作iframe子页面的安全漏洞及跨域限制问题
一.父子交互的跨域限制 同域情况下,父页面和子页面可以通过iframe.contentDocument或者parent.document来交互(彼此做DOM操作等,如父页面往子页面注入css). 跨域 ...
- C#泛型方法解析
C#2.0引入了泛型这个特性,由于泛型的引入,在一定程度上极大的增强了C#的生命力,可以完成C#1.0时需要编写复杂代码才可以完成的一些功能.但是作为开发者,对于泛型可谓是又爱又恨,爱的是其强大的功能 ...
- 使用Beautiful Soup编写一个爬虫 系列随笔汇总
这几篇博文只是为了记录学习Beautiful Soup的过程,不仅方便自己以后查看,也许能帮到同样在学习这个技术的朋友.通过学习Beautiful Soup基础知识 完成了一个简单的爬虫服务:从all ...
- 在项目中同时使用Objective-C和Swift
苹果发布的Swift语言可以和之前的Objective-C语言同时存在于一个项目中. 可能有人会认为是同一个类文件中既可以有Objective-C也可以有Swift,这是不对的.同一个类文件或同一个代 ...
- Basic Tutorials of Redis(6) - List
Redis's List is different from C#'s List,but similar with C#'s LinkedList.Sometimes I confuse with t ...
- SHA-256算法
SHA-.h #ifndef _SHA_256_H #define _SHA_256_H #include<iostream> using namespace std; typedef u ...