现在的位置: 首页 > 综合 > 正文

使用gdb调试正在运行的程序

2019年04月01日 ⁄ 综合 ⁄ 共 835字 ⁄ 字号 评论关闭

文章来源:http://wiki.ubuntu.org.cn/index.php?title=%E7%94%A8GDB%E8%B0%83%E8%AF%95%E7%A8%8B%E5%BA%8F&variant=zh-hans 

一般来说GDB主要调试的是C/C++的程序。要调试C/C++的程序,首先在编译时,我们必须要把调试信息加到可执行文件中。使用编译器(cc/gcc/g++)的 -g 参数可以做到这一点。如:

$gcc -g -Wall hello.c -o hello
$g++ -g -Wall hello.cpp -o hello

如果没有-g,你将看不见程序的函数名、变量名,所代替的全是运行时的内存地址。当你用-g把调试信息加入之后,并成功编译目标代码以后,让我们来看看如何用gdb来调试他。

启动GDB的方法有以下几种:

  • gdb <program>
program也就是你的执行文件,一般在当前目录下。
  • gdb <program> core
用gdb同时调试一个运行程序和core文件,core是程序非法执行后core dump后产生的文件。
  • gdb <program> <PID>
如果你的程序是一个服务程序,那么你可以指定这个服务程序运行时的进程ID。gdb会自动attach上去,并调试他。program应该在PATH环境变量中搜索得到。

以上三种都是进入gdb环境和加载被调试程序同时进行的。也可以先进入gdb环境,在加载被调试程序,方法如下:

*在终端输入:gdb
*在gdb环境中:file <program>
这两步等价于:gdb <program>

对于gdb常用的调试方式,也基本都会,但是当被问到如何对已经运行的程序进行调试时,就不知道怎么处理了,因此在网上查找资料发现可以通过以下方式

首先,要求被调试的程序在-g编译的前提下,

先开个新的窗口ps -u 找到需要调试对应的进程编号

然后进入gdb 通过 使用attach+进程编号的方式,就可以对该进程进行调试了,结下了的如查看 修改值等类似于gdb常规的调试方式。

抱歉!评论已关闭.