linux gdb 忽略信号,linux gdb调试基本命令

近年来,随着嵌入式技术飞速发展,嵌入式产品随处可见,Linux的应用也越来越广泛。接下来是小编为大家收集的linux gdb调试基本命令,希望能帮到大家。

linux 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 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

注意:

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调试程序用法 http://www.linuxidc.com/Linux/2013-06/86044.htm

GDB+GDBserver无源码调试Android 动态链接库的技巧 http://www.linuxidc.com/Linux/2013-06/85936.htm

使用hello-gl2建立ndk-GDB环境(有源码和无源码调试环境) http://www.linuxidc.com/Linux/2013-06/85935.htm

在Ubuntu上用GDB调试printf源码 http://www.linuxidc.com/Linux/2013-03/80346.htm

Linux下用GDB调试可加载模块 http://www.linuxidc.com/Linux/2013-01/77969.htm

Ubuntu下使用GDB断点Go程序 http://www.linuxidc.com/Linux/2012-06/62941.htm

使用GDB命令行调试器调试C/C++程序 http://www.linuxidc.com/Linux/2014-11/109845.htm

看了“linux gdb调试基本命令”还想看:

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

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

相关文章

Adobe Dreamweaver 添加库、标签和属性

您可以在 Dreamweaver 中使用标签库编辑器添加标签库,并将标签和属性添加到标签库中。 添加一个标签库在标签库编辑器(“编辑”>“标签库”)中,单击加号 () 按钮,然后选择“新建标签库”。在“库名称”框中&#xf…

白话debounce和throttle

遇到的问题 在开发过程中会遇到频率很高的事件或者连续的事件,如果不进行性能的优化,就可能会出现页面卡顿的现象,比如: 鼠标事件:mousemove(拖曳)/mouseover(划过)/mouseWheel(滚屏)键盘事件:keypress(基于…

Windows平台下使用Active Directory对Subversion进行权限控制(非完美解决方案)

Windows平台下使用Active Directory对Subversion进行权限控制(非完美解决方案) Windows平台下使用Active Directory对Subversion进行权限控制(非完美解决方案) 目前网上找到的Subversion的配置说明中,关于用户权限控制…

wireshark抓包工具的使用及分析

前段时间看到群里在讨论Wireshark抓包工具,想写一篇使用笔记但一直没来得及写,本篇就通过实例来分享wireshark抓包工具的使用。Wireshark简介 Wireshark 是一个网络封包分析软件。网络封包分析软件的功能是撷取网络封包,并尽可能显示出最为详…

EventLoop笔记

node环境 Event Loop各阶段: - timers 阶段:这个阶段执行 setTimeout 和 setInterval 的回调函数。- I/O callbacks 阶段:不在 timers 阶段、close callbacks 阶段和 check 阶段这三个阶段执行的回调,都由此阶段负责&#xff0c…

如何实现android和服务器长连接呢?推送消息的原理

转载地址:http://blog.csdn.net/q376420785/article/details/8653958 前言:现在的大多数移动端应用都有实时得到消息的能力,简单来说,有发送消息的主动权和接受消息的被动权。例如:微信,QQ,天气…

linux入门系统那个好,初学Linux哪个发行版本好?这些更合适!

Linux是非常受欢迎的技术,现在很多人都开始转行学习Linux,不过大家都知道Linux发行版本众多,在学习的时候我该选择哪个发行版本呢?为大家介绍一下。其实在挑选Linux发行版本之前,我们首先要根据自己的需求决定。如果抱着试试的心…

git 使用及常用命令介绍

一、git 常用命令 git clone 地址 克隆项目 git status 查看当前状态 git add 文件或文件夹 (加入本地暂存目录) git commit -m "注释" 提交到本地版本库(暂存区) git commit -a -m "注释" 提交全部改动文件 …

asp.net中的记忆盲区

<1> 连接数据库 用read方法取出数据 在web.config取出连接字符串 string sqlconn ConfigurationManager.ConnectionStrings["db_showHouseConnectionString"].ToString(); SqlConnection connnew SqlConnection (sqlconn ); SqlComman…

调试网络收发不通问题

今天在做之前一个项目重构的事情&#xff0c;需要把之前的代码重新做功能&#xff0c;我们有两个设备&#xff0c;他们通过网线连接&#xff0c;用UDP来传输数据。很多人都怀疑UDP丢包什么&#xff0c;不及时什么之类的&#xff0c;如果想把事情做得足够快&#xff0c;最好还是…

VB6.0和VB.Net对照表

想在网上找一下VB.Net中&#xff0c;哪些是VB6.0遗留下来的东西&#xff0c;哪些是VB.Net增加的东西。结果中文的没有找到&#xff0c;找到了一个日文网页。简单的翻译了一下&#xff0c;放在这里&#xff0c;供需要的人参考。 VB6.0和VB.Net的对照表VB6.0VB.NETAddItem Object…

hibernate的初次使用

转载地址&#xff1a;http://blog.csdn.net/aboy123/article/details/10222675 一、Hibernate概述 &#xff08;一&#xff09;什么是Hibernate&#xff1f; hibernate核心内容是ORM&#xff08;关系对象模型&#xff09;。可以将对象自动的生成数据库中的信息&#xff0c;使…

linux 关联数组,linux 普通数组和关联数组

数组&#xff1a;就是借助索引将多个数据存储为一个集合。普通数组&#xff1a;数组的索引只能使用整数关联数组&#xff1a;数组的索引可以使用整数和字符串(要bash4.0以上的版本才支持关联数组)数组通常与循环或者其他判断式交互使用才有比较高的意义普通数组的定义array1(a …

layui之在table的编辑的按钮的思考

点编辑的时候&#xff0c;如果没有在html界面写form&#xff0c;而是在同级目录下写的 修改html的话呢&#xff0c; 就可以在点 编辑 按钮的时候&#xff0c;调用打开tab的方法&#xff0c;把form的html打开&#xff0c;而不用去后台转发转载于:https://www.cnblogs.com/fuckin…

删除rz上传失败乱码的文件

通过rz上传文件失败时&#xff0c;会产生大小为0的乱码的文件&#xff0c;如下 ls -l -rw-r–r– 1 root root 47031 12-15 13:48 ?ղ??.htm 这种类型的文件可用以下命令 find . -maxdepth 1 -size 0 | xargs rm -rf 说明&#xff1a;这种文件大小为0&#xff0c;并且在上…

我用过 | Keil的发展历史

Keil&#xff0c;相信搞嵌入式软硬件开发的读者都不陌生&#xff0c;在全球单片机&#xff08;MCU&#xff09;集成开发环境&#xff08;IDE&#xff09;中&#xff0c;可以说 Keil 占据了半壁江山。Keil 既是一家公司的名称&#xff0c;也是一款 IDE 软件。下面讲述一下 Keil …

C#实现简单WEB服务器

一、HTTP协议的作用原理WWW是以Internet作为传输媒介的一个应用系统&#xff0c;WWW网上最基本的传输单位是Web网页。WWW的工作基于客户机/服务器计算模型&#xff0c;由Web 浏览器(客户机)和Web服务器(服务器)构成&#xff0c;两者之间采用超文本传送协议&#xff08;HTTP&…

奥鹏C语言专科在线作业答案,电子科大12春《C语言(专科)》在线作业三

《C语言(专科)》在线作业三试卷总分&#xff1a;100 测试时间&#xff1a;-- 试卷得分&#xff1a;100单选题、单选题(共 20 道试题&#xff0c;共 100 分。) 得分&#xff1a;1001. 若有定义&#xff1a;intw[3][5];&#xff0c;则以下不能正确表示该数组元素…

理解Android Binder机制原理

原文地址&#xff1a; http://blog.csdn.net/universus/article/details/6211589 Binder是Android系统进程间通信&#xff08;IPC&#xff09;方式之一。Linux已经拥有的进程间通信IPC手段包括(Internet Process Connection)&#xff1a; 管道&#xff08;Pipe&#xff09;、信…

嵌入式算法-傅里叶变换算法

摘要&#xff1a;傅里叶变换的核心在于&#xff0c;“任何连续周期信号可以由一组适当的正弦曲线组合而成”&#xff0c;在这个基础上对信号的中特定频率的正弦波进行分解或者重组&#xff0c;基于频率方面分析波形。1、傅里叶变换的意义近似周期性的方波&#xff08;橙色&…