GDB怎么调试运行着的程序

如题所述

第1个回答  2016-08-20
下面是一段测试代码。
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绑定后,就可以来对每一段代码进行调试。本回答被网友采纳

GDB调试命令方法总结
1. 调试启动开始调试可以通过以下方式:直接启动程序:`gdb 程序名称`调试coredump:`gdb 程序名称 coredump文件`调试运行进程:`gdb 程序名称 进程id` 或者 `gdb -p 进程id`带参数调试:`gdb --args 应用程序 参数1 参数2 ...`2. 程序运行- run 或者 r 运行程序,可以配置参数:`set args 参...

gdb调试命令是什么?
gdb <program> <PID> 这里,<program>是程序的可执行文件名,<PID>是要调试程序的PID.如果你的程序是一个服务程序,那么你可以指定这个服务程序运行时的进程ID。gdb会自动attach上去,并调试他。program应该在PATH环境变量中搜索得到。5、启动程序之后,再启动gdb调试 gdb <PID> 这里,程序是一个服务...

GDB基本用法:调试C\/C++程序的常见命令解析
1. 启动GDB可以有两种方式启动GDB:一是直接在命令行输入gdb命令,加载程序;二是启动时直接加载,如:gdb your_program。2. 常见命令设置断点: 使用break或b命令,例如:break 10 设置在第10行断点,或break foo 设置在函数foo入口。运行程序: 用run或r命令,如:run --arg1 --arg2。单步执行: ...

gdb使用流程
首先,编写一个简单的程序test.c,包含main函数和sum函数。在编辑器中编写并保存后,使用gcc编译器添加"-g"选项生成可执行文件test。进入gdb调试环境,启动gdb并载入可执行文件。gdb会显示版本信息和库文件等细节。在gdb命令行界面,通过"l"命令查看源代码,可以看到行号标记,方便定位。设置断点是关键步骤...

个人学习总结--GDB调试用法以及ros中使用GDB
一、GDB调试用法 1. 安装GDB,大多数Linux发行版中使用包管理器安装。2. 编译包含调试信息的程序,使用gcc编译命令添加-g选项。3. 启动GDB,加载程序并显示提示符。4. 设置断点,使用break命令在指定行设置断点。5. 运行程序,使用run命令启动。6. 检查和控制程序执行,使用GDB命令检查变量、调用栈。7...

GDB 的 7 个单步调试命令 | Linux 中国
tbreak命令是设置临时断点的利器,尤其在处理复杂函数调用链时,可以简化调试流程。disable命令则用于临时禁用断点,避免干扰。除了step和finish,advance命令允许你直接运行到指定位置,如果未到达,程序会在当前函数结束时停止。而skip命令则可以跳过特定函数,提供了灵活的选择。总结来说,GDB的step命令及其变种...

使用gdb调试MPI——案例教学
终端输出所有进程PID,基于PID进行gdb调试。调试四个进程,PID为12952~12955,启动gdb进入调试环境。通过attach指令逐一连接PID,以PID=12952为例,打断点在sleep()函数第31行。运行程序,输入c,遇到断点,将当前进程j设置为0,令其跳出循环,继续执行。逐一尝试剩余进程,发现问题进程在gdb内显示错误信息...

GDB 简介 调试 使用实例
gdb的强大功能包括设置断点,监控变量值,单步执行程序,查看和修改变量和寄存器,检查堆栈情况,甚至支持远程调试。要使用gdb,首先需要在编译源代码时添加-g选项以生成调试信息。运行时,通过命令如gdb progname启动调试器,然后通过一系列命令如list、run、break等进行调试。以下是gdb的一些实用操作实例:在...

gdb\/cgdb常见调试命令详细总结
1. 调试过程详解在程序编译时加入-g或-ggdb选项以生成调试信息,了解两者差异。gdb调试通过一系列命令,如设置断点、观察点和查看变量,进行细致的操作。2. 常用命令与参数2.1 调试运行进程2.2 调试线程控制2.3 修改程序参数,如set args2.4 断点操作:添加、删除和控制程序执行流程2.5 打印变量值...

GDB调试命令详解
使用watch命令监控变量值,或者使用next命令按行执行代码。在遇到运行中的程序需要调试时,首先找到进程ID,然后通过gdb命令连接并执行调试操作。结束后,记得解除GDB与程序的连接,以恢复程序正常运行。通过上述命令,GDB为开发者提供了强大的工具,帮助他们更有效地诊断和修复代码问题。

相似回答