GDB(十)--调试正在运行的进程

我编写了一个循环:

long i;
    for (i = 0; i < 999999; i++) {
        mt.a += 1;
        sleep(1);
    }
把它编译成a.out,并在后台执行它:./a.out &

[1] 2570

然后用命令gdb ./a.out 2570可以附加到这个进程上。被时进程会中断。

或者在GDB里输入attach 2570同样可以附加到进程。

输入bt来查看栈

(gdb) bt
#0  0x008e9416 in __kernel_vsyscall ()
#1  0x003bb900 in nanosleep () from /lib/i386-linux-gnu/libc.so.6
#2  0x003bb71f in sleep () from /lib/i386-linux-gnu/libc.so.6
#3  0x0804845d in main () at ptype_struct.c:22
可以看到程序正中断在系统调用vsyscall上。用frame 3进入main函数的栈框架并打印i的值,

(gdb) frame 3
#3  0x0804845d in main () at ptype_struct.c:22
22            sleep(1);
(gdb) p i
$1 = 153
next可以执行下一行。

(gdb) next
Single stepping until exit from function __kernel_vsyscall,
which has no line number information.
0x003bb900 in nanosleep () from /lib/i386-linux-gnu/libc.so.6

设置i的值。

(gdb) p i = 999999
$3 = 999999

detach可以分离进程。
(gdb) detach
Detaching from program: /home/tommy/tmp/a.out, process 2570
(gdb) q
[1]+  完成                  ./a.out

如果被调试的进程没有调试信息:

$ strip ./a.out 
$ ./a.out &
[1] 2603
tommy:~/tmp$ gdb
gdb> attach 2603

(gdb) bt
#0  0x00b0f416 in __kernel_vsyscall ()
#1  0x00721900 in nanosleep () from /lib/i386-linux-gnu/libc.so.6
#2  0x0072171f in sleep () from /lib/i386-linux-gnu/libc.so.6
#3  0x0804845d in ?? ()
#4  0x0069e113 in __libc_start_main () from /lib/i386-linux-gnu/libc.so.6
#5  0x08048351 in ?? ()
函数名没有被打印。

注意GDB其实可以看作是ptrace系统调用的前端。ptrace专门用来观察和控制另一个进程的执行。观察别的进程可能需要恰当的权限,比如超级用户。不要去调试init进程,不然可能会很伤。我不小心把它杀掉,电脑直接黑屏。

相关资料:

时间: 2024-10-03 23:15:43

GDB(十)--调试正在运行的进程的相关文章

gdb调试正在运行的进程

[转自] http://hi.baidu.com/brady_home/blog/item/6b92aa8ffdfee2e6f01f369b.html gdb调试正在运行的进程 2009年04月18日 星期六 下午 08:21 有时会遇到一种很特殊的调试需求,对当前正在运行的其它进程进行调试(正是我今天遇到的情形).这种情况有可能发生在那些无法直接在调试器中运行的进程身上,例如有的进程 只能在系统启动时运行.另外如果需要对进程产生的子进程进行调试的话,也只能采用这种方式.GDB可以对正在执行的程

GDB代码调试与使用

GDB代码调试与使用 Linux下GDB调试代码 源代码 编译生成执行文件 gcc -g test.c -o test 使用GDB调试 启动GDB:gdb test 从第一行列出源代码:list 直接回车表示,重复上一次命令 设置断点,在源程序16行处:break 16 设置断点,在函数func()入口处:break func 查看断点信息:info break 运行程序:run 在断点处停住 单条语句执行:next 继续运行程序:continue[程序输出:result[1-100]=5050

Linux内核分析-使用gdb跟踪调试内核从start_kernel到init进程启动

姓名:江军 ID:fuchen1994 实验日期:2016.3.13 实验指导 使用实验楼的虚拟机打开shell cd LinuxKernel/ qemu -kernel linux-3.18.6/arch/x86/boot/bzImage -initrd rootfs.img 内核启动完成后进入menu程序(<软件工程C编码实践篇>的课程项目),支持三个命令help.version和quit,您也可以添加更多的命令,对选修过<软件工程C编码实践篇>的童鞋应该是a piece of

gdb单步调试时top看不到所调试的进程

最近用gdb调试程序时,新开窗口用top命令查看调试进程的内存占用情况,但总遇到在单步调试时,由于程序执行太慢,top看不到调试进程的情况. 后查明,这是由于默认进入top时,各进程是按照CPU的占用量来排序的,单步调试程序执行太慢,有时cpu占用量为0. 解决办法:在top窗口用键盘敲"u",然后输入当前用户名,则top窗口显示的都为该用户下的进程信息. 其他一些有用也很有意思的top视图 多U多核CPU监控在top基本视图中,按键盘数字"1",可监控每个逻辑CP

针对 Linux 环境下 gdb 动态调试获取的局部变量地址与直接运行程序时不一致问题的解决方案

基础的缓冲区溢出实践通常需要确定运行状态下程序中的某些局部变量的地址,如需要确定输入缓冲区的起始地址从而获得注入缓冲区中的机器指令的起始地址等.在 Linux 环境下,可通过 gdb 对程序进行动态调试,从而获得程序运行状态下的信息( 关闭 ALSR 机制 ),基础的 gdb 操作可参见笔者的文章Linux下编辑.编译.调试命令总结--gcc和gdb描述.使用 gdb 可以方便的获取程序动态运行状态下的信息,但通过 gdb 动态调试获取的诸如缓冲区的起始地址等信息可能与程序实际运行时的信息并不相

gdb 远程调试android进程 -转

什么是gdb 它是gnu组织开发的一个强大的unix程序调试工具,我们可以用它来调试Android上的C.C++代码. 它主要可以做4件事情: 随心所欲地启动你的程序. 设置断点,程序执行到断点处会停住.(断点可以是表达式) 程序被停住后,可以查看此时程序中发生的事. 动态改变程序的执行环境. GDB远程调试原理图 如图上所示,我们需要使用gdbserver依附到我们要调试的进程上,gdb通过adbd和手机上的gdbserver 进行socket通信. 远程调试实战 在手机上启动gdbserve

gdb 远程调试android进程

原文:http://blog.csdn.net/xinfuqizao/article/details/7955346?utm_source=tuicool 什么是gdb 它是gnu组织开发的一个强大的unix程序调试工具,我们可以用它来调试Android上的C.C++代码. 它主要可以做4件事情: 随心所欲地启动你的程序. 设置断点,程序执行到断点处会停住.(断点可以是表达式) 程序被停住后,可以查看此时程序中发生的事. 动态改变程序的执行环境. GDB远程调试原理图 如图上所示,我们需要使用g

opensips/kamailio gdb代码调试方法详解

 要对kamailio/opensips进行单步调试,就需要先了解其代码的结构及运行方式,kamailio/opensips使用Reactor和Proactor结合的IO网络模型,使用主进程负责监听网络,当有连接产生或首包到达时,就通过pipe将文件描述符发送给worker进程,worker进程就会负责此连接的数据取读.业务处理.数据发送等事情,然后再次等待此socket事件.当我们想要调试一段代码时,就先确认这段代码是运行在什么类型的进程中,通常用于处理SIP逻辑的代码都是在worker进

ubuntu下gdb代码调试

1.什么是GDB? GDB全称是GNU Project Debugger,当程序执行时,让你可以进入到另一个程序的内部查看,或者当一个程序崩溃的时候它在做什么. GDB可以帮助你做如下四种主要的方面,来帮助你捕捉到bug: 1.启动你的程序,指定可能影响你行为的事情(设定初始的一些变量) 2.在特殊的条件的时候暂停你的程序执行(在端点的时候可以暂停,或者说是条件的暂停) 3.当程序暂停的时候,可以查看这个时候发生了什么(查询堆栈,变量) 4.通过改变程序中的参数,你可以通过实验得出某一个bug所