中易网

GDB怎么调试运行着的程序

答案:1  悬赏:70  
解决时间 2021-01-14 03:13
GDB怎么调试运行着的程序
最佳答案
下面是一段测试代码。
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绑定后,就可以来对每一段代码进行调试。
我要举报
如以上问答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
linux 5.5 ftp的详细配置
来自自家蜂场的纯蜂蜜为什么不好
转发网关和端口映射有什么区别?
我的一位男性朋友据说患了脆x染色体综合征,
鸿泰大厦停车场(松龄东路与淄城路交叉口东100
跪求尊礼情头
短波电台从A端发出呼叫,在B端可以通过短波中
叶子上面绿色下面红色梗子也是绿的它是什么菜
大雪像什么的比喻诗句
怎么刷新系统啊
农行企业网银转账汇款到外地公司账号前面是不
一个小游戏,好像是以前按键手机上面的。就是
上面西下面米是什么字
皇马洗衣生活馆(南山路)地址好找么,我有些事
春芽炒鸡蛋怎么做好吃
推荐资讯
盈盈一水间的盈盈是什么意思
看见蛇,把蛇打死了
门锁拧一半开不开什么原因
32寸液晶显示器分辨率是多少
005期双色球开奖号码是多少
谁有连接
查询系别为ma的女同学的基本信息sql
x加1的绝对值加上x减2的绝对值大于a恒成立,
AC100-240V给AC85-265V数码探照灯充电行吗
来安县图书馆地址在哪,我要去那里办事
若x m ÷x 3n =x,则m与n的关系是( ) A
C#中什么是工厂模式,什么是单列模式
手机登qq时,显示手机磁盘不足,清理后重新登
刺客的套装怎么选啊?