第02课:启动GDB调试

使用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就可以调试了,操作如下:

[email protected]:~/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 文件中去,放到这个文件最后一行即可。

原文地址:https://www.cnblogs.com/wzqstudy/p/10235007.html

时间: 2024-10-31 06:33:46

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

GDB调试——启动调试程序

一.启动 >>gdb启动 gdb 调试之前加载调试符号,即编译时候加 –g选项,如 gcc file.c –g –o target 启用gdb的方法种有3种,一种是启动core,还有是attach一个已经运行的进程. 1. gdb <program> 2. gdb <program> core 用gdb同时调试一个运行程序和core文件,core是程序非法执行后core dump后产生的文件. 3. gdb <program> <PID> 如果你

[C++]GDB调试C++类

GDB调试C++类 Linux上调试常用的工具就是gdb了.借助学习C++虚函数表和内存布局的机会顺便学习下gdb常规调试技巧. 一,测试用例 1,C++头文件(szyu_test_gdb.h) /****************************** * * Author : szyu * * Date : 2016.10.25 * ********************************/ #ifndef __SZYU_GDB__ #define __SZYU_GDB__ #i

GDB调试器的使用

http://blog.chinaunix.net/uid-23193900-id-3184605.html 1.什么是程序的调试? 程序调试的目的就是找出程序中隐藏的故障,校正那些不正常的指令,使程序能够正常工作. 2.调试的类别 程序的调试有几种不同的级别.最高级别当然是编程人员通过自己肉眼观察和推断,找出那些有毛病的代码并修改之.最低级别是对汇编代码进行调试.由于汇编语言代码的复杂.冗长与不直观.在汇编级对程序进行调试是一件比较费力的事. 使用得最多的大概还是源程序级即符号级的调试,在此种

GDB调试&mdash;&mdash;常用的命令

首先说明一点,如果我们要使用GDB来调试我们的C/C++程序时,在使用GCC编译程序时,应该带上 –g 参数, 它负责生成 与GDB相关的调试信息: 1.如何对一个文件启动GDB调试? 方法一: 命令行输入:  gdb filename 方法二: 命令行输入: gdb                 , 进行gdb工作界面以后,再输入命令: file filename             ,其中file为gdb的一个命令: 2. 常见的GDB命令: 命令 解释 示例 file <文件名>

gdb 调试 golang

说明:作为一门静态语言,似乎支持调试是必须的,而且,Go初学者喜欢问的问题也是:大家都用什么IDE?怎么调试? 其实,Go是为多核和并发而生,真正的项目,你用单步调试,原本没问题的,可能会调出有问题.更好的调试方式是跟PHP这种语言一样,用打印的方式(日志或print). 当然,简单的小程序,如果单步调试,可以看到一些内部的运行机理,对于学习还是挺有好处的.下面介绍一下用GDB调试Go程序:(目前IDE支持调试Go程序,用的也是GDB.要求GDB 7.1以上) 以下内容来自雨痕的<Go语言学习笔

c/c++基础(二十六) gdb调试so 教程

当自己开发了一个so文件,如何调试呢? 对与如何编写一个so,请参考文章:http://blog.csdn.net/zz7zz7zz/article/details/41448987 对于如何进行gdb调试,请参考文章:http://blog.csdn.net/zz7zz7zz/article/details/41654457 假设我们的源文件分别是: filea.c #include <stdio.h> void fun1() { printf("i am from filea f

工具篇之GDB调试器用法

GDB 完成的作用: 启动程序,可以按照工程师自定义的要求随心所欲的运行程序 让被调试的程序在工程师指定的断点处停住,断点可以是条件表达式 当程序被停住时,可以检查此时程序中所发生的事,并追索上文 动态改变程序的运行环境 常见问题: 如何打印变量的值?(print var) 如何打印变量的地址?(print &var) 如何打印地址的数据值?(print *address) 如何查看当前运行的文件和行?(backtrace) 如何查看指定文件的代码?(list file:N) 如何立即执行完当前

使用gdb调试

启用gdb进行调试二进制程序,必须在二进制程序在采用gcc或g++编译时加入-g参数 启动gdb进行调试的几种形式: 直接启动gdb程序进行调试program程序 gdb program 启动gdb挂载入进程号为pid的进程进行调试,挂载后gdb会暂停该进程的执行 gdb -p pid 若程序运行崩溃产生了coredump文件,可采用该方式进行调试 gdb program coredumpfile 带入相应的参数启动gdb调试program程序 gdb --args program arg1 a

第七课 GDB调试 (下)

1序言: 通过前面一节第六课 GDB调试 (下)文章,可以掌握理解了gdb调试:怎么启动.运行,打断点.查看变量.甚至改变变量等的知识,今天来大概讲解下调试bug的类型. 2知识点: 2.1 就像之前所说的没有任何一个程序员敢打包票自己写的代码是没任何bug,bug总会有意无意的出现在我们眼前,当程序运行结果于我们预期结果不一样的时候这时候我们就应该调试,总的来说bug分为:语法错误.逻辑错误.硬件异常: 3原理: 3.1 语法错误:一般情况下出现在编译的时候会有提示编译错误这时候我们就可以马上