中易网

GDB怎么调试运行着的程序

答案:1  悬赏:70  
解决时间 2021-01-14 03:13
  • 提问者网友:回忆在搜索
  • 2021-01-13 07:18
GDB怎么调试运行着的程序
最佳答案
  • 二级知识专家网友:千夜
  • 2021-01-13 08:45
下面是一段测试代码。
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
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绑定后,就可以来对每一段代码进行调试。
我要举报
如以上回答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
点此我要举报以上问答信息!
大家都在看
推荐信息