使用GDB调试程序一般有三种方式:

  gdb filename

  gdb attach pid

  dgb filename corename

也对应这本节课的核心内容:

  直接调试目标程序

  附加进程

  调试core文件

接下来我们逐一讲解。

2.1直接调试目标程序

  在开发阶段或者研究别人的项目时,当编译成功生成目标二进制文件后,可以使用gdb filename直接启动这个程序的调试,其中filename是需要启动的调试程序文件名,这种方式是直接使用GDB启动一个程序进行调试。注意这里说的启动一个程序进行调试其实不严谨,因为实际上只是附加了一个可执行文件,并没有把程序启动起来;接着需要输入run命令,程序才会真正的运行起来;接着需要输入run命令,程序才会真正的运行起来。关于run命令后面的课程中会详细介绍。上一课的GDB调试hello_server系列就是使用的这种方式。

  假设现在有一个程序叫fileserver,使用gdb fileserver附加该程序,然后使用run面过了启动该程序。如下图所示:

2.2附加进程

  在某些情况下,一个程序已经启动了,我们向调试这个程序,但是又不想重启这个程序。假设有这样一个场景,我们的测试服务器程序正在运行,运行一段时间之后,发现这个服务器不能接受新的客户端连接了,这时肯定是不能重启的,如果重启,当前程序的各种状态信息就丢失了。怎么办呢?可以使用gdb attach 进程ID来将GDB调试器附加到测试服务器程序上。例如,假设聊天程序叫myserver,可以使用ps命令获取进程的PID,然后使用gdb attach就可以调试了,操作如下:

wzq@wzq-PC:~/Desktop/unimrcp-1.5.0-client-build-dir/unimrcp/bin$ ps -ef | grep unimrcpserver
wzq 23316 23213 0 18:10 pts/1 00:00:00 ./unimrcpserver
wzq 23339 23329 0 18:10 pts/2 00:00:00 grep unimrcpserver

  实际执行如下图所示:

  通过以上代码得到myserver的PID为23329,然后使用gdb attach 23329把GDB附加到myserver进程中,操作并输入如下:

  当提示“Attaching to process 23940”时就说明我们已经成功地将GDB附加到目标程序进程了。需要注意的是,程序使用了一些系统库(如libc.so),由于这时发行版本的Linux系统,这些库是没有调试符号的,因而GDB会提示找不到这些库的调试符号。因为目的是调试myserver,对系统API调用的内部实现并不关注,所以这些提示可以不用关注,只要myserver这个文件有调试信息即可。

  当用gdb attach上目标进程后,调试器会暂停下来,此时可以使用continue命令让程序继续运行,或者加上相应的断电再继续运行程序(这里提到的continue命令不熟悉也没有关系,后续会详细介绍这些命令的使用方法)。

  当调试完程序想结束此调试时,而且不对当前进程myserver有任何影响,也就是说想让这个程序继续运行,可以在GDB的命令界面输入detach命令让程序与GDB调试器分离,这样myserver就可以继续运行了:

  然后再退出GDB就可以了:

2.3调试生成core文件

  有时候,服务器程序运行一段时间后会突然崩溃,这并不是我们希望看到的,需要解决这个问题。只要程序在崩溃的时候有 core 文件产生,就可以使用这个 core 文件来定位崩溃的原因。当然,Linux 系统默认是不开启程序崩溃产生 core 文件这一机制的,我们可以使用 ulimit -c 命令来查看系统是否开启了这一机制。

  发现 core file size 那一行默认是 0,表示关闭生成 core 文件,可以使用“ulimit 选项名 设置值”来修改。例如,可以将 core 文件生成改成具体某个值(最大允许的字节数),这里我们使用 ulimit -c unlimited(unlimited 是 -c 选项值)直接修改成不限制大小。

  还有一个问题就是,这样修改以后,当我们关闭这个 Linux 会话,设置项的值就会被还原成 0,而服务器程序一般是以后台程序(守护进程)长周期运行,也就是说当前会话虽然被关闭,服务器程序仍然继续在后台运行,这样这个程序在某个时刻崩溃后,是无法产生 core 文件的,这种情形不利于排查问题。因此,我们希望这个选项永久生效,永久生效的方式是把“ulimit -c unlimited”这一行加到 /etc/profile 文件中去,放到这个文件最后一行即可。

第02课:启动GDB调试的更多相关文章

  1. 第二课:启动 GDB 调试

    使用 GDB 调试程序一般有三种方式: gdb filename gdb attach pid gdb filename corename 这也对应着本节课的核心内容: 直接调试目标程序 附加进程 调 ...

  2. GDB调试笔记

    参考资料:GDB调试精粹及使用实例 # 调试实例 #include <iostream> #include <cstring> using namespace std; ][] ...

  3. Nginx学习之十四-GDB调试Nginx初试

    本文的测试环境: Win7+虚拟机VMWareVMware-workstation-full-7.1.4-385536+Ubuntu12.04 Nginx-1.4.0 要想有效的研究Nginx源码,必 ...

  4. Linux下GDB调试简单示例

    这里介绍对文件first.c的基本GDB调试操作,只有部分命令,只是一个示例,运行环境为装有gcc编译器和gdb调试器的Linux环境,基本GDB调试命令如下表: 命令                 ...

  5. GDB调试——常用的命令

    首先说明一点,如果我们要使用GDB来调试我们的C/C++程序时,在使用GCC编译程序时,应该带上 –g 参数, 它负责生成 与GDB相关的调试信息: 1.如何对一个文件启动GDB调试? 方法一: 命令 ...

  6. 使用gdb调试

    启用gdb进行调试二进制程序,必须在二进制程序在采用gcc或g++编译时加入-g参数 启动gdb进行调试的几种形式: 直接启动gdb程序进行调试program程序 gdb program 启动gdb挂 ...

  7. gdb调试段错误及使用

    在编程调试中,经常出现段错误,此时可用gdb调试.具体方法为注册段错误信号处理函数,在处理函数中启动gdb.具体代码如下: void segv_handler(int no) { ]; ]; FILE ...

  8. gdb调试快速入门

    编译指令 gcc test.c -o test -g -g是加入调试信息,加入源码信息 启动gdb调试 gdb test 进入gdb中 设置参数 set args 10 20 显示参数show age ...

  9. 第七课 GDB调试 (下)

    1序言: 通过前面一节第六课 GDB调试 (下)文章,可以掌握理解了gdb调试:怎么启动.运行,打断点.查看变量.甚至改变变量等的知识,今天来大概讲解下调试bug的类型. 2知识点: 2.1 就像之前 ...

随机推荐

  1. 使用relo

    安装好插件以后,选择一个工程,右键点击relo connection(如果已经连接了就不需要点击).点击navigate,open relo session,选择一个文件,可以打开这个文件的类图,点击 ...

  2. css(float浮动和clear清除)

    教程开始: 首先要知道,div是块级元素,在页面中独占一行,自上而下排列,也就是传说中的流.如下图: 可以看出,即使div1的宽度很小,页面中一行可以容下div1和div2,div2也不会排在div1 ...

  3. rocketMQ retry 消息的实现

    consumer 消费失败,会把消息重新发往 %RETRY% + consumerGroup,这个 retry 消息会在一定时间后,真实送到 retry topic. broker 处理发送到 ret ...

  4. ProxySQL 常见表配置

    ProxySQL 常见表配置 [root@mgr1 opt]# rpm -ivh proxysql-1.4.14-1.1.el6.x86_64.rpm warning: proxysql-1.4.14 ...

  5. PPT添加节

    如果你要做很多PPT,而又不想把PPT分到很多个文件里,你可以在PPT中添加节(Section).这样你的PPT就像书本一样,一章一章的,非常方便.

  6. 使用xUnits来实现单元测试

    目录 前言 单元测试 xUnit 小结 附录 前言 从开始敲代码到现在,不停地都是在喊着记得做测试,记得自测,测试人员打回来扣你money之类的,刚开始因为心疼钱(当然还是为了代码质量),就老老实实自 ...

  7. Pytorch笔记 (3) 科学计算1

    一.张量 标量 可以看作是  零维张量 向量 可以看作是  一维张量 矩阵 可以看作是  二维张量 继续扩展数据的维度,可以得到更高维度的张量 ————>  张量又称 多维数组 给定一个张量数据 ...

  8. Pytorch笔记 (1) 初始神经网络

    一.人工神经元 上方人工神经元中: 输入 * 权重 ——>  相当于 人神经元中  树突的功能 各输入 相加 ,再做非线性变化f ——>  相当于胞体的功能 将非线性变化的结果输出 ——& ...

  9. Appium - multiprocessing.pool.MaybeEncodingError-【 “Can’t pickle local object ‘PoolManager.__init__.<locals>.<lambda>‘】

    公司同事学习自动化新装环境后,run多进程测试用例时出错: multiprocessing.pool.MaybeEncodingError: Error sending result: ’<ap ...

  10. python学习之函数(一)

    4.4函数 面向过程编程的缺点: ​ 1.代码重复: ​ 2.代码可描述性不高: 4.4.1 函数初识 ​ 函数是对代码块动作和功能的封装定义:函数是以功能为导向,一个为函数封装一个功能. ​ 优点: ...