GDB怎么调试运行着的程序

 我来答
若以下回答无法解决问题,邀请你更新回答
huanglenzhi
2016-08-20 · 知道合伙人数码行家
huanglenzhi
知道合伙人数码行家
采纳数:117538 获赞数:517193
长期从事计算机组装,维护,网络组建及管理。对计算机硬件、操作系统安装、典型网络设备具有详细认知。

向TA提问 私信TA
展开全部
下面是一段测试代码。
test.c
#include < stdio.h >
#include < unistd.h >

static void PrintMessage(int i);
static void GoToSleep(void);

int main(void)
{
int i = 100000;

while ( 1 )
{
PrintMessage( i );
GoToSleep();
i -= 1;
}

return 0;
}

void PrintMessage(int i)
{
char buf[1024];
sprintf(buf,"%d bottles of beer on the wall.\n", i);
printf("%s",buf);

}

static void GoToSleep(void)
{
sleep(3);
}

接下来是编译时使用的Makefile文件.
TARGET = test
SRC = $(TARGET).c
OBJ = $(TARGET).o
CC = gcc
CFLAGS = -g3 -W -Wall -std=c99

$(TARGET): $(OBJS)

.PHONY: clean

clean:
$(RM) $(TARGET) $(OBJS)

此程序是一个服务程序,程序一旦启动,将作为一个进程永驻内存,可以通过
~@hqlong ps -ef | grep "test"

来查看该进程的信息。
此程序主要实现每3秒钟向墙上打印一瓶啤酒。对于这样的一个启动就作为一个进程进驻内存的程序应该怎么来进行调试呢?接下来的事情就是要来回来这个问题,
通过make来对源文件进行编译。
~@hqlong make

这里会在当前目录下产生一个test的可执行文件。
在对程序进行正式调试之前来回忆一个使用GDB调试一个非服务程序的步骤。假设test这个可执行文件是一个非服务程序,那么一般是通过如下几步方式来进行调试的。
hqlong@ubuntu:/tmp$ gdb test
GNU gdb 6.8-debian
Copyright (C) 2008 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http ://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law. Type "show copying"
and "show warranty" for details.
This GDB was configured as "i486-linux-gnu"...
(gdb) b 1
Breakpoint 1 at 0x80483f4: file beer-process.c, line 1.
(gdb) r
Starting program: /tmp/test

Breakpoint 1, main () at beer-process.c:9
warning: Source file is more recent than executable.
9 {
(gdb) n
main () at beer-process.c:10
10 int i = 100000;
(gdb) q
The program is running. Exit anyway? (y or n) y
http>

首先是通过gdb test来调试程序。然后使用b(break) 1在第一行设置断点,然后使用r(run) 来运行程序,最后使用n来单步运行程序,如果想要查看运行中某变量的值,可能通过p(print)来打印。如查看i的值,就可以通过p i。最后使用q(quit)来退出程序。
由于服务程序一旦启动,就以进程的方式进驻内存,不退出,所以和非服务程序的调试方式有一些区别。
服务一旦启动后,系统会分配一个pid,然后使用gdb绑定上这个pid,最后就可以通过通用方式进行调试了。
绑定进程的方式有下几种。
hqlong@ubuntu:/tmp$ ./test &
100000 bottles of beer on the wall.
[1] 25292

方式一
通过–pid参数来绑定指定的进程程序。
~@hqlong gdb --pid 25552

方式二
通过程序和进程号来绑定。
~@hqlong gdb test 25552

方式二
先启动gdb后,通过attach来绑定pid
~@hqlong gdb
gdb) attach 25552

将pid和gdb绑定后,就可以来对每一段代码进行调试。
本回答被网友采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 1条折叠回答
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式