gdb命令总结

1、启动调试

前置条件:编译生成执行码时带上 -g,如果使用Makefile,通过给CFLAGS指定-g选项,否则调试时没有符号信息。

gdb program //最常用的用gdb启动程序,开始调试的方式
gdb --args program args //带参数启动或者 set args 参数,主要参数没有加“参数”
gdb -x /home/local/gdbinit --args grogram args //带自定义gdbinit脚本启动
gdb program core //用gdb查看core dump文件,跟踪程序core的原因
gdb attach pid //用gdb调试已经开始运行的程序,指定pid即可

如果systemd接管了core文件:

coredumpctl list 或者coredumpctl list --since=todey
coredumpctl info PID查看核心转储 或者coredumpctl gdb PID

有时候程序会剔除符号表,可以通过以下命令:

gdb -e /bin/a.out -c  core.1234 -s ./debug/
或者在gdb状态下输入symbol目录
或者把符号表拷贝到lib目录(也有可能是bin目录),然后gdb直接运行

导入环境变量和显示环境变量:set environment和show environment

2、调试命令

①、执行命令模式

-batch选项。比如:打印$pid进程所有线程的堆栈并退出。
gdb -ex "set pagination 0" -ex "thread apply all bt" -batch -p $pid

②、交互模式

run/r //运行程序
continue/c //中断后继续运行到下一个断点
step/s //单步执行,进入函数
si     //单步执行汇编指令
next/n //单步执行,不进入函数
return //函数未执行完,忽略未执行的语句,返回
finish //函数执行完毕返回
call //调佣某一个函数
list/l //显示源码,①、list [起始行],[结束行]: ;②、list [行号]: ;
③、list [文件名]:[行号]/[起始行],[结束行]
call //调用某一个函数
whatis //查看变量类型
pwd    //当前的工作目录
set directory //设置gdb的工作目录
help/h 命令 //查看指定命令的使用方法
quit //退出gdb调试

③、断点

break/b //break [行号];break [函数名];break [行号]/[函数名] if[条件]
tbreak  //设置临时断点,到达后删除,用法同上
condition 断点号 //修改对应断点的条件
info b  //查看所设断点 
delete/d //删除断点, delete/d [断点符号],如果不带编号则视为删除所有断点,
编号可以通过info b查
disable 断点号 断点号 //禁止一个多个断点,如果不带编号视为禁止全部编号
enable 断点号 断点号 //使能一个多个断点,如果不带编号视为使能全部编号
ignore 断点号 num //忽略对应断点num次
commond 断点号 //断点触发时,执行命令,一般用于打印变量
(gdb) command 1
Type commands for breakpoint(s) 1, one per line.
End with a line saying just "end".
>print x
>end
(gdb)

④、信息查看

print/p //打印值,还可以跟函数返回p add(3,5),也可以打印寄存器的值 p $pc;
设置:
set print elements N //指定打印的长度,对长字符串特别有用。
set print element 0 //输出完整的字符串
set print pretty //设置GDB打印结构的时候,每行一个成员,并且有相应的缩进,缺省是关闭的
p /x xxx //16进制显示
p str@str_len
堆栈:
bt/info stack // 显示堆栈信息,bt N显示开头的N个栈帧,bt -N显示最后N个栈帧
frame/f N //显示第N层栈帧info f/frame //列出栈帧信息,包含程序运行时死掉的PC指针、函数入口变量在栈中的位置、
接口中临时变量的地址、非法地址错误的起始值、连续多次输入可以查看每一层frame信息
info locals //列出程序异常处的局部变量及其值,还有在栈中的编译
info args   //打印出当前函数的参数名及其值,还有在栈中的编译 
info variables //列出所有的局部变量(按照文件顺序逐一列举)
info line:文件名:函数名 //展示文件中某函数的入口地址和结束地址(动态库则是偏移)
info registers //查看寄存器信息,i r t0 at//仅仅查看t0和at两个寄存器的值
info sym addr //打印符合信息scope for:函数名 //查看函数中各个变量在栈中可能偏移值
disassemble 函数名 //查看函数的汇编代码

⑤、检测点

只能在程序启动后设置,现在main处设置断点,让程序启动后暂停在main处。

watch //为表达式(变量)expr设置一个观察点。一量表达式值有变化时,马上停住程序。
rwatch //当表达式(变量)expr被读时,停住程序。
awatch //当表达式(变量)的值被读或被写时,停住程序。
info watchpoints //列出当前所设置了的所有观察点。

经验:观察某个变量是否变化,被读或者被写,由于变量只在某一个作用域,可以获取变量的地址,然后观察。
比如:观察examined_rows变量神马时候被修改
(1).p &examined_rows,得到地址
(2).watch *(ha_rows *) 0x7ffec8005e28,则可以观察这个变量的变化情况

⑥、内存查看 

格式: 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表示以双字节为一个单位。

⑦、多线程查看

info threads //查看线程
thread/t 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启动了不停模式,除了断点有关的线程会被停下来,其他线程会执行。

⑧、信号量

(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信号

3、捕获回溯

在调试器中运行以下命令记录信息:

set logging file mybacktrace.txt
set logging on

你可能会发现关闭分页有帮助,对于长的回溯,这样可以节省时间

set pagination off

现在运行回溯:

thread apply all bt full

参考文章:https://www.percona.com/blog/2011/08/26/getting-mysql-core-file-on-linux/ 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/636415.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Docker-安装实践(mysql,redis集群,tomcat)

docker实践(提供几个安装案例&#xff09; 安装Tomcat # 拉取镜像,可以指定标签不指定默认为最新 docker pull tomcat docker run -itd -p 8080:8080 --name tomcat tomcat:latest #这样内部默认80端口&#xff0c;主机的映射端口会随机分配一个 docker run -itd -P tomcat…

基于web的亚热带常见自然林病虫害识别系统——开篇

文章目录 前言概要论文组织结构相关理论技术简介TensorflowDjango web 开发框架图像的分类的发展感受 绪论研究背景与意义国内外研究现状 前言 随着年底的到来&#xff0c;我相信越来越多的小伙伴也要开始着手自己的毕业设计&#xff0c;这里打算分享我自己的毕业设计&#xf…

python通过元类为客户类自动添加方法

1 python通过元类为客户类自动添加方法 python为不同的类添加相同的方法&#xff0c;有多种方式。 若已知需添加的方法&#xff0c;可以通过继承添加方法&#xff0c;或对象嵌入的组合进行添加。 若需添加的方法为动态不可知&#xff0c;可以通过辅助函数或元类进行添加。 …

Python-基础篇-数据结构-列表、元组、字典、集合

文章目录 思维导图❓ 大抵是何物数据结构切片 &#x1f4ac;具体是何物列表&#x1f4bb; list&#x1f4bb; [ ]自我介绍精神面貌使用说明生理体征增删查改 方法汇总 元组&#x1f4bb; tuple&#x1f4bb; ( )自我介绍使用说明精神面貌生理体征增删查改 字典&#x1f4bb; di…

网络爬虫基本原理介绍

网络爬虫是一种自动化程序&#xff0c;用于从互联网上获取信息并进行数据抓取。它通过发送HTTP请求获取网页内容&#xff0c;并解析网页内容提取所需信息。 一、网络爬虫的基本原理 什么是网络爬虫&#xff1f; 网络爬虫是一种自动化程序&#xff0c;模拟人类在网页上的行为&a…

【C++】vector容器接口要点的补充

接口缩容 在VS编译器的模式下&#xff0c;类似于erase和insert接口的函数通常会进行缩容&#xff0c;因此&#xff0c;insert和erase行参中的迭代器可能会失效。下图中以erase为例&#xff1a; 代码如下&#xff1a; #include <iostream> #include <vector> #inclu…

Python——条形图正负不同色加表格

条形图&#xff0c;当差值大于0时设置一个颜色&#xff0c;反之另一种颜色&#xff0c;并添加表格 import pandas as pd import numpy as np import matplotlib.pyplot as plt import matplotlib.ticker as mtick import matplotlib.ticker as ticker#设置输出结果对齐方式 pd…

Qt 5.15.2 (MSVC 2019)编译 QWT 6.2.0 : 编译MingW或MSVC遇到的坑

MingW下编译QWt 6.2.0 下载qwt最新版本&#xff0c;用git工具 git clone下载源码 git clone https://git.code.sf.net/p/qwt/git qwt-git 或者使用我下载的 qwt 2.6.0 链接&#xff1a;https://pan.baidu.com/s/1KZI-L10N90TJobeqqPYBqw?pwdpq1o 提取码&#xff1a;pq1o 下载…

python-基础篇-高级变量类型

文章目录 高级变量类型目标知识点回顾 01. 列表1.1 列表的定义1.2 列表常用操作del 关键字&#xff08;科普&#xff09;关键字、函数和方法&#xff08;科普&#xff09; 1.3 循环遍历1.4 **应用场景** 02. 元组2.1 元组的定义创建空元组元组中 **只包含一个元素** 时&#xf…

一、基础数据结构——2.队列——2.循环队列

参考资料&#xff1a;《算法竞赛》&#xff0c;罗勇军 郭卫斌 著 本博客作为阅读本书的学习笔记&#xff0c;仅供交流学习。 建议关注 罗勇军老师博客 [NOIP2010 提高组] 机器翻译 题目背景 NOIP2010 提高组 T1 题目描述 小晨的电脑上安装了一个机器翻译软件&#xff0c;他…

教您如何下载保存钉钉视频到电脑本地

教您如何下载保存钉钉视频到电脑和手机相册地瓜网络技术 大家好&#xff0c;我们这边是地瓜网络技术&#xff01;30秒教会你下载钉钉视频&#xff01;现在很多群管理员把视频设置为禁止下载&#xff0c;导致我们无法正常的下载群直播回放视频&#xff0c; 今天我们就教大家如何…

AWS 专题学习 P7 (FSx、SQS、SNS)

文章目录 Amazon FSx – 概述Amazon FSx for LustreFSx Lustre - 文件系统部署选项 Amazon FSx for NetApp ONTAPAmazon FSx for OpenZFSHybrid Cloud 存储AWS 存储云原生选项AWS 存储网关Amazon S3 File GatewayAmazon FSx File GatewayVolume GatewayTape GatewayStorage Gat…

纯前端网页编辑Office文档安全预览之打开Word文档后禁止另存为....

在线办公weboffice的过程中&#xff0c;有时候我们在共享文件时&#xff0c;有一些重要文件&#xff0c;比如合同、客户资源等&#xff0c;常常希望用户可以打开共享文件&#xff0c;但禁止复制共享文件内容&#xff0c;同时也禁止将共享文件另存为本地&#xff0c;那么如何实现…

生产力与生产关系 —— 语音转文字,抛开键盘输入

生产力与生产关系 —— 语音转文字&#xff0c;抛开键盘输入 自从用了语音转文字的识别软件之后&#xff0c;我的码字速度有了快速的提高&#xff0c; 现在的这段文字就是我通过语音识别生成的&#xff0c;传统的键盘输入 在自己一个人的时候不太合适&#xff0c;那个速度太慢了…

【LeetCode】141. 环形链表

leetcode题目链接 141. 环形链表 #include <stdio.h> #include <stdbool.h>struct ListNode {int val;struct ListNode* next; }; typedef struct ListNode ListNode;bool hasCycle(ListNode* head) {ListNode* slow head, * fast head;while (fast &&…

微信小程序 image bindload 事件不触发,图片加载不出来

问题&#xff1a; 当小程序图片页面反复跳转时&#xff0c;或者微信打开小程序页面之后&#xff0c;处于后台运行。 图片加载不出来&#xff0c;我图片加载是通过bindload事件不判断是否下载完成再显示。但是现在bindload不触发&#xff0c;一直显示加载层。 分析&#xff1…

鸿蒙 HarmonyOS ArkTS ArkUI 动画 中心扩展、向下扩展、纵向扩展

EntryComponentstruct Index {State widthA: number 0State heightA: number 0onPageShow():void{animateTo ( {duration: 2000,iterations: -1,curve:Curve.Linear}, () > {this.widthA 200this.heightA 200} )}build() {Column() {// 中心扩展Column(){}.width(this.wi…

什么是中间件?

文章目录 为什么需要中间件&#xff1f;中间件生态漫谈数据库中间件读写分离分库分表引进数据库中间件MyCat 服务端代理模式ShardingJDBC 客户端代理模式 总结 IT 系统从单体应用逐渐向分布式架构演变&#xff0c;高并发、高可用、高性能、分布式等话题变得异常火热&#xff0c…

【Arduino】无法上传程序到开发板,报错 avrdude: ser_open(): can‘t set com-state for “\\.\COM6“

问题描述 在尝试将项目上传到Arduino板子时&#xff0c;尽管开发板已被正确连接&#xff0c;并且IDE中能够正常读取到开发板信息&#xff0c;但是上传过程中仍然出现了问题。 下面是IDE中显示的开发板信息&#xff1a; 当尝试上传程序时&#xff0c;控制台报错信息如下&#…

APP测试基本流程以及APP测试要点梳理,保证您看了不后悔!

&#x1f525; 交流讨论&#xff1a;欢迎加入我们一起学习&#xff01; &#x1f525; 资源分享&#xff1a;耗时200小时精选的「软件测试」资料包 &#x1f525; 教程推荐&#xff1a;火遍全网的《软件测试》教程 &#x1f4e2;欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1…